<?php require_once($INC . "/util.inc.php"); require_once($INC . "/log.inc.php"); require_once($INC . "/sql.inc.php"); require_once($INC . "/events.inc.php"); require_once($INC . "/cache.inc.php"); $rg_plan_error = ""; function rg_plan_set_error($str) { global $rg_plan_error; $rg_plan_error = $str; rg_log($str); } function rg_plan_error() { global $rg_plan_error; return $rg_plan_error; } /* * Validates plan name */ function rg_plan_ok($name) { if (empty($name)) return FALSE; return TRUE; } /* * Add/edit a plan * If uid > 0 - edit, else, add */ function rg_plan_edit($db, $d) { rg_prof_start("plan_edit"); rg_log_enter("plan_edit: d: " . rg_array2string($d)); $ret = FALSE; while (1) { if (rg_plan_ok($d['name']) !== TRUE) break; if ($d['id'] == 0) { // add $sql = "INSERT INTO plans (name, description, disk_mb" . ", users, bw, speed, position" . ", max_public_repos, max_private_repos)" . " VALUES (@@name@@, @@description@@" . ", @@disk_mb@@, @@users@@, @@bw@@" . ", @@speed@@, @@position@@" . ", @@max_public_repos@@, @@max_private_repos@@)" . " RETURNING id"; } else { // edit $sql = "UPDATE plans" . " SET name = @@name@@" . ", description = @@description@@" . ", disk_mb = @@disk_mb@@" . ", users = @@users@@" . ", bw = @@bw@@" . ", speed = @@speed@@" . ", position = @@position@@" . ", max_public_repos = @@max_public_repos@@" . ", max_private_repos = @@max_private_repos@@" . " WHERE id = @@id@@" . " RETURNING id"; } $res = rg_sql_query_params($db, $sql, $d); if ($res === FALSE) { rg_plan_set_error("cannot insert/update plan" . " (" . rg_sql_error() . ")"); break; } $row = rg_sql_fetch_array($res); rg_sql_free_result($res); $d['id'] = $row['id']; // invalidate cache rg_cache_unset("plan::list"); $ret = $row['id']; break; } rg_log_exit(); rg_prof_end("plan_edit"); return $ret; } /* * Delete plans; list is array("<id>" => "<junk>, ...) */ function rg_plan_remove($db, $list) { rg_prof_start("plan_remove"); rg_log_enter("plan_remove: list=" . rg_array2string($list)); $ret = FALSE; while (1) { $my_list = array(); foreach ($list as $id => $junk) $my_list[] = sprintf("%u", $id); $sql_list = implode(", ", $my_list); $sql = "DELETE FROM plans WHERE id IN (" . $sql_list . ")"; $res = rg_sql_query($db, $sql); if ($res === FALSE) { rg_plan_set_error("cannot remove plan $id" . " (" . rg_sql_error() . ")"); break; } rg_sql_free_result($res); // invalidate cache rg_cache_unset("plan::list"); $ret = TRUE; break; } rg_log_exit(); rg_prof_end("plan_remove"); return $ret; } /* * Return the list of plans */ function rg_plan_list($db) { rg_prof_start("plan_list"); rg_log_enter("plan_list"); $ret = FALSE; while (1) { $ret = rg_cache_get("plan::list"); if ($ret !== FALSE) break; $sql = "SELECT * FROM plans ORDER BY position"; $res = rg_sql_query($db, $sql); if ($res === FALSE) { rg_plan_set_error("cannot get plan list" . " (" . rg_sql_error() . ")"); break; } $ret = array(); while (($row = rg_sql_fetch_array($res))) { $row['exists'] = 1; $id = $row['id']; // fixes $row['HTML:description_nlbr'] = nl2br(rg_xss_safe($row['description'])); $ret[$id] = $row; } rg_sql_free_result($res); rg_cache_set("plan::list", $ret); break; } rg_log_exit(); rg_prof_end("plan_list"); return $ret; } /* * Returns info about a plan (by id) */ function rg_plan_info($db, $id) { rg_prof_start("plan_info"); rg_log_enter("plan_info: id=$id"); $ret = array(); $ret['ok'] = 0; $ret['exists'] = 0; while (1) { $list = rg_plan_list($db); if ($list === FALSE) { rg_plan_set_error("cannot load plans" . " (" . rg_sql_error() . ")"); break; } $ret['ok'] = 1; $id = sprintf("%u", $id); if (!isset($list[$id])) break; $ret = array_merge($ret, $list[$id]); break; } rg_log_exit(); rg_prof_end("plan_info"); return $ret; } /* * Returns a select list */ function rg_plan_select($db, $plan_id) { $list = rg_plan_list($db); if ($list === FALSE) return rg_warning("Could not load plans."); $ret = "<select name=\"plan_id\">\n"; foreach ($list as $row) { $add = ""; if ($row['id'] == $plan_id) $add = " selected"; $ret .= "<option value=\"" . rg_xss_safe($row['id']) . "\"" . $add . ">" . rg_xss_safe($row['name']) . "</option>\n"; } $ret .= "</select>\n"; return $ret; } /* * High-level function for rg_plan_list */ function rg_plan_list_high_level($db, $rg) { $ret = ""; $list_errmsg = array(); $del_errmsg = array(); $delete = rg_var_uint("delete"); while (1) { if ($delete != 1) break; if (!rg_valid_referer()) { $del_errmsg[] = "invalid referer; try again"; break; } if (!rg_token_valid($db, $rg, FALSE)) { $del_errmsg[] = "Invalid token. Try again."; break; } $list = rg_var_str("delete_list"); $r = rg_plan_remove($db, $list); if ($r !== TRUE) { $rg['errmsg'] = rg_plan_error(); $del_errmsg[] = rg_template("admin/plans/delete_err.html", $rg); break; } break; } $list = rg_plan_list($db); if ($list === FALSE) { $rg['errmsg'] = rg_plan_error(); // TODO: really? no array append?! return rg_template("admin/plans/list_err.html", $rg); } $rg['rg_form_token'] = rg_token_get($db, $rg); $rg['HTML:del_errmsg'] = rg_template_errmsg($del_errmsg); $ret .= rg_template_table("admin/plans/list", $list, $rg); return $ret; } /* * High-level function for rg_plan_edit. */ function rg_plan_edit_high_level($db, &$rg) { rg_log("plan_edit_high_level rg:" . rg_array2string($rg)); if (isset($rg['pi']['id'])) $id = $rg['pi']['id']; else $id = 0; $ret = ""; $pi = array(); if ($rg['doit'] == 0) { if ($id > 0) { $pi = rg_plan_info($db, $id); if ($pi['exists'] != 1) { $ret .= rg_warning("Invalid plan."); return $ret; } } else { // Defaults $pi['id'] = 0; $pi['name'] = ""; $pi['description'] = ""; $pi['disk_mb'] = "0"; $pi['users'] = "0"; $pi['bw'] = "0"; $pi['speed'] = "0"; $pi['position'] = "100"; $pi['max_public_repos'] = "0"; $pi['max_private_repos'] = "0"; } } $errmsg = array(); $load_form = TRUE; while (1) { if ($rg['doit'] != 1) break; $pi = array(); if ($id > 0) $pi['id'] = $id; else $pi['id'] = rg_var_uint("pi::id"); $pi['name'] = rg_var_str("pi::name"); $pi['description'] = trim(rg_var_str("pi::description")); $pi['disk_mb'] = rg_var_uint("pi::disk_mb"); $pi['users'] = rg_var_uint("pi::users"); $pi['bw'] = rg_var_uint("pi::bw"); $pi['speed'] = rg_var_uint("pi::speed"); $pi['position'] = rg_var_uint("pi::position"); $pi['max_public_repos'] = rg_var_uint("pi::max_public_repos"); $pi['max_private_repos'] = rg_var_uint("pi::max_private_repos"); if (!rg_valid_referer()) { $errmsg[] = "invalid referer; try again"; break; } if (!rg_token_valid($db, $rg, FALSE)) { $errmsg[] = "invalid token; try again"; break; } $r = rg_plan_edit($db, $pi); if ($r === FALSE) { $errmsg[] = "cannot add/edit plan: " . rg_plan_error(); break; } $ret .= rg_template("admin/plans/add_ok.html", $rg); $load_form = FALSE; break; } if ($load_form) { $rg['pi'] = $pi; $rg['HTML:errmsg'] = rg_template_errmsg($errmsg); $rg['rg_form_token'] = rg_token_get($db, $rg); $ret .= rg_template("admin/plans/add_edit.html", $rg); } return $ret; } ?>