<?php require_once($INC . "/util.inc.php"); require_once($INC . "/log.inc.php"); require_once($INC . "/sql.inc.php"); require_once($INC . "/user.inc.php"); require_once($INC . "/prof.inc.php"); $rg_watch_error = ""; function rg_watch_set_error($str) { global $rg_watch_error; $rg_watch_error = $str; } function rg_watch_error() { global $rg_watch_error; return $rg_watch_error; } /* * Returns a watched entry */ $rg_watch_load_cache = array(); function rg_watch_load($db, $type, $login_uid, $obj_id1, $obj_id2) { global $rg_watch_load_cache; $key = $type . "-" . $login_uid . "-" . $obj_id1 . "-" . $obj_id2; if (isset($rg_watch_load_cache[$key])) return $rg_watch_load_cache[$key]; rg_prof_start("watch_load"); rg_log("watch_load: type=$type login_uid=$login_uid obj_id=$obj_id1/$obj_id2"); $ret = FALSE; do { if (strcmp($type, "bug") == 0) { $sql = "SELECT 1 FROM watch_bug" . " WHERE uid = $login_uid" . " AND repo_id = $obj_id1" . " AND bug_id = $obj_id2"; } else if (strcmp($type, "repo") == 0) { $sql = "SELECT 1 FROM watch_repo" . " WHERE uid = $login_uid" . " AND repo_id = $obj_id1"; } else { rg_internal_error("Invalid watch type!"); break; } $res = rg_sql_query($db, $sql); if ($res === FALSE) break; $rows = rg_sql_num_rows($res); rg_sql_free_result($res); $ret = $rows > 0 ? 1 : 0; $rg_watch_load_cache[$key] = $ret; } while (0); rg_prof_end("watch_load"); return $ret; } /* * Add somebody to the watch list */ $rg_watch_add_state = array(); function rg_watch_add($db, $type, $login_uid, $obj_id1, $obj_id2) { global $rg_watch_add_state; // If watch already added, skip. $key = $type . "-" . $login_uid . "-" . $obj_id1 . "-" . $obj_id2; if (isset($rg_watch_add_state[$key])) return $rg_watch_add_state[$key]; rg_prof_start("watch_add"); rg_log("watch_add type=$type, login_uid=$login_uid obj_id=$obj_id1/$obj_id2"); $ret = FALSE; do { $r = rg_watch_load($db, $type, $login_uid, $obj_id1, $obj_id2); if ($r === FALSE) break; if ($r === 1) { // already in watch list $ret = TRUE; break; } if (strcmp($type, "bug") == 0) { $sql = "INSERT INTO watch_bug (uid, repo_id, bug_id)" . " VALUES ($login_uid, $obj_id1, $obj_id2)"; } else if (strcmp($type, "repo") == 0) { $sql = "INSERT INTO watch_repo (uid, repo_id)" . " VALUES ($login_uid, $obj_id1)"; } else { rg_internal_error("Invalid watch type!"); break; } $res = rg_sql_query($db, $sql); if ($res === FALSE) break; rg_sql_free_result($res); $ret = TRUE; } while (0); $rg_watch_add_state[$key] = $ret; rg_prof_end("watch_add"); return $ret; } /* * Delete somebody from the watch list */ function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2) { rg_prof_start("watch_del"); rg_log("watch_del type=$type, login_uid=$login_uid obj_id=$obj_id1/$obj_id2"); $ret = FALSE; do { if (strcmp($type, "bug") == 0) { $sql = "DELETE FROM watch_bug" . " WHERE uid = $login_uid" . " AND repo_id = $obj_id1" . " AND bug_id = $obj_id2"; } else if (strcmp($type, "repo") == 0) { $sql = "DELETE FROM watch_repo" . " WHERE uid = $login_uid" . " AND repo_id = $obj_id1"; } else { rg_internal_error("Invalid watch type!"); break; } $res = rg_sql_query($db, $sql); if ($res === FALSE) break; rg_sql_free_result($res); $ret = TRUE; } while (0); rg_prof_end("watch_del"); return $ret; } /* * Returns a list of uids by type and obj_id */ function rg_watch_load_by_obj_id($db, $type, $obj_id1, $obj_id2) { rg_prof_start("watch_load_by_obj_id"); rg_log("watch_load_by_obj_id: type=$type obj_id=$obj_id1/$obj_id2"); $ret = FALSE; do { if (strcmp($type, "bug") == 0) { $sql = "SELECT uid FROM watch_bug" . " WHERE repo_id = $obj_id1" . " AND bug_id = $obj_id2"; } else if (strcmp($type, "repo") == 0) { $sql = "SELECT uid FROM watch_repo" . " WHERE repo_id = $obj_id1"; } else { rg_internal_error("Invalid watch type!"); break; } $res = rg_sql_query($db, $sql); if ($res === FALSE) break; $ret = array(); while (($row = rg_sql_fetch_array($res))) { $ret[] = $row['uid']; } rg_sql_free_result($res); } while (0); rg_prof_end("watch_load_by_obj_id"); return $ret; } ?>