コード例 #1
0
/**
 * This function will generate the values that are required to complete
 * the "Edit event" form given the name of a event.
 *
 * @param string $name The name of the event.
 *
 * @return array Data necessary to create the editor.
 */
function PMA_EVN_getDataFromName($name)
{
    global $db;
    $retval = array();
    $columns = "`EVENT_NAME`, `STATUS`, `EVENT_TYPE`, `EXECUTE_AT`, " . "`INTERVAL_VALUE`, `INTERVAL_FIELD`, `STARTS`, `ENDS`, " . "`EVENT_DEFINITION`, `ON_COMPLETION`, `DEFINER`, `EVENT_COMMENT`";
    $where = "EVENT_SCHEMA " . PMA\libraries\Util::getCollateForIS() . "=" . "'" . PMA\libraries\Util::sqlAddSlashes($db) . "' " . "AND EVENT_NAME='" . PMA\libraries\Util::sqlAddSlashes($name) . "'";
    $query = "SELECT {$columns} FROM `INFORMATION_SCHEMA`.`EVENTS` WHERE {$where};";
    $item = $GLOBALS['dbi']->fetchSingleRow($query);
    if (!$item) {
        return false;
    }
    $retval['item_name'] = $item['EVENT_NAME'];
    $retval['item_status'] = $item['STATUS'];
    $retval['item_type'] = $item['EVENT_TYPE'];
    if ($retval['item_type'] == 'RECURRING') {
        $retval['item_type_toggle'] = 'ONE TIME';
    } else {
        $retval['item_type_toggle'] = 'RECURRING';
    }
    $retval['item_execute_at'] = $item['EXECUTE_AT'];
    $retval['item_interval_value'] = $item['INTERVAL_VALUE'];
    $retval['item_interval_field'] = $item['INTERVAL_FIELD'];
    $retval['item_starts'] = $item['STARTS'];
    $retval['item_ends'] = $item['ENDS'];
    $retval['item_preserve'] = '';
    if ($item['ON_COMPLETION'] == 'PRESERVE') {
        $retval['item_preserve'] = " checked='checked'";
    }
    $retval['item_definition'] = $item['EVENT_DEFINITION'];
    $retval['item_definer'] = $item['DEFINER'];
    $retval['item_comment'] = $item['EVENT_COMMENT'];
    return $retval;
}
コード例 #2
0
/**
 * Creates the contents for a row in the list of routines
 *
 * @param array  $routine  An array of routine data
 * @param string $rowclass Empty or one of ['even'|'odd']
 *
 * @return string HTML code of a row for the list of routines
 */
function PMA_RTN_getRowForList($routine, $rowclass = '')
{
    global $ajax_class, $url_query, $db, $titles;
    $sql_drop = sprintf('DROP %s IF EXISTS %s', $routine['type'], PMA\libraries\Util::backquote($routine['name']));
    $type_link = "item_type={$routine['type']}";
    $retval = "        <tr class='{$rowclass}'>\n";
    $retval .= "            <td>\n";
    $retval .= '                <input type="checkbox"' . ' class="checkall" name="item_name[]"' . ' value="' . htmlspecialchars($routine['name']) . '" />';
    $retval .= "            </td>\n";
    $retval .= "            <td>\n";
    $retval .= "                <span class='drop_sql hide'>" . htmlspecialchars($sql_drop) . "</span>\n";
    $retval .= "                <strong>\n";
    $retval .= "                    " . htmlspecialchars($routine['name']) . "\n";
    $retval .= "                </strong>\n";
    $retval .= "            </td>\n";
    $retval .= "            <td>\n";
    // this is for our purpose to decide whether to
    // show the edit link or not, so we need the DEFINER for the routine
    $where = "ROUTINE_SCHEMA " . PMA\libraries\Util::getCollateForIS() . "=" . "'" . $GLOBALS['dbi']->escapeString($db) . "' " . "AND SPECIFIC_NAME='" . $GLOBALS['dbi']->escapeString($routine['name']) . "'" . "AND ROUTINE_TYPE='" . $GLOBALS['dbi']->escapeString($routine['type']) . "'";
    $query = "SELECT `DEFINER` FROM INFORMATION_SCHEMA.ROUTINES WHERE {$where};";
    $routine_definer = $GLOBALS['dbi']->fetchValue($query, 0, 0, $GLOBALS['controllink']);
    $curr_user = $GLOBALS['dbi']->getCurrentUser();
    // Since editing a procedure involved dropping and recreating, check also for
    // CREATE ROUTINE privilege to avoid lost procedures.
    if (PMA\libraries\Util::currentUserHasPrivilege('CREATE ROUTINE', $db) && $curr_user == $routine_definer || $GLOBALS['is_superuser']) {
        $retval .= '                <a ' . $ajax_class['edit'] . ' href="db_routines.php' . $url_query . '&amp;edit_item=1' . '&amp;item_name=' . urlencode($routine['name']) . '&amp;' . $type_link . '">' . $titles['Edit'] . "</a>\n";
    } else {
        $retval .= "                {$titles['NoEdit']}\n";
    }
    $retval .= "            </td>\n";
    $retval .= "            <td>\n";
    // There is a problem with PMA\libraries\Util::currentUserHasPrivilege():
    // it does not detect all kinds of privileges, for example
    // a direct privilege on a specific routine. So, at this point,
    // we show the Execute link, hoping that the user has the correct rights.
    // Also, information_schema might be hiding the ROUTINE_DEFINITION
    // but a routine with no input parameters can be nonetheless executed.
    // Check if the routine has any input parameters. If it does,
    // we will show a dialog to get values for these parameters,
    // otherwise we can execute it directly.
    $definition = $GLOBALS['dbi']->getDefinition($db, $routine['type'], $routine['name'], $GLOBALS['controllink']);
    if ($definition !== false) {
        $parser = new SqlParser\Parser($definition);
        /**
         * @var CreateStatement $stmt
         */
        $stmt = $parser->statements[0];
        $params = SqlParser\Utils\Routine::getParameters($stmt);
        if (PMA\libraries\Util::currentUserHasPrivilege('EXECUTE', $db)) {
            $execute_action = 'execute_routine';
            for ($i = 0; $i < $params['num']; $i++) {
                if ($routine['type'] == 'PROCEDURE' && $params['dir'][$i] == 'OUT') {
                    continue;
                }
                $execute_action = 'execute_dialog';
                break;
            }
            $retval .= '                <a ' . $ajax_class['exec'] . ' href="db_routines.php' . $url_query . '&amp;' . $execute_action . '=1' . '&amp;item_name=' . urlencode($routine['name']) . '&amp;' . $type_link . '">' . $titles['Execute'] . "</a>\n";
        } else {
            $retval .= "                {$titles['NoExecute']}\n";
        }
    }
    $retval .= "            </td>\n";
    $retval .= "            <td>\n";
    if (PMA\libraries\Util::currentUserHasPrivilege('CREATE ROUTINE', $db) && $curr_user == $routine_definer || $GLOBALS['is_superuser']) {
        $retval .= '                <a ' . $ajax_class['export'] . ' href="db_routines.php' . $url_query . '&amp;export_item=1' . '&amp;item_name=' . urlencode($routine['name']) . '&amp;' . $type_link . '">' . $titles['Export'] . "</a>\n";
    } else {
        $retval .= "                {$titles['NoExport']}\n";
    }
    $retval .= "            </td>\n";
    $retval .= "            <td>\n";
    $retval .= '                <a ' . $ajax_class['drop'] . ' href="sql.php' . $url_query . '&amp;sql_query=' . urlencode($sql_drop) . '&amp;goto=db_routines.php' . urlencode("?db={$db}") . '" >' . $titles['Drop'] . "</a>\n";
    $retval .= "            </td>\n";
    $retval .= "            <td>\n";
    $retval .= "                 {$routine['type']}\n";
    $retval .= "            </td>\n";
    $retval .= "            <td dir=\"ltr\">\n";
    $retval .= "                " . htmlspecialchars($routine['returns']) . "\n";
    $retval .= "            </td>\n";
    $retval .= "        </tr>\n";
    return $retval;
}