File inc/watch.inc.php changed (mode: 100644) (index 3817a05..1f0d9d4) |
... |
... |
function rg_watch_set_error($str) |
11 |
11 |
{ |
{ |
12 |
12 |
global $rg_watch_error; |
global $rg_watch_error; |
13 |
13 |
$rg_watch_error = $str; |
$rg_watch_error = $str; |
14 |
|
rg_log($str); |
|
|
14 |
|
rg_log('Set error to ' . $str); |
15 |
15 |
} |
} |
16 |
16 |
|
|
17 |
17 |
function rg_watch_error() |
function rg_watch_error() |
|
... |
... |
function rg_watch_error() |
24 |
24 |
/* |
/* |
25 |
25 |
* Returns a watched entry |
* Returns a watched entry |
26 |
26 |
*/ |
*/ |
27 |
|
$rg_watch_load_cache = array(); |
|
28 |
27 |
function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2) |
function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2) |
29 |
28 |
{ |
{ |
30 |
|
global $rg_watch_load_cache; |
|
31 |
|
|
|
32 |
|
$key = $type . "-" . $uid . "-" . $obj_id1 . "-" . $obj_id2; |
|
33 |
|
if (isset($rg_watch_load_cache[$key])) |
|
34 |
|
return $rg_watch_load_cache[$key]; |
|
35 |
|
|
|
36 |
29 |
rg_prof_start("watch_load"); |
rg_prof_start("watch_load"); |
37 |
30 |
rg_log_enter("watch_load: type=$type uid=$uid obj_id=$obj_id1/$obj_id2"); |
rg_log_enter("watch_load: type=$type uid=$uid obj_id=$obj_id1/$obj_id2"); |
38 |
31 |
|
|
39 |
32 |
$ret = FALSE; |
$ret = FALSE; |
40 |
33 |
while (1) { |
while (1) { |
41 |
|
$params = array("uid" => $uid, |
|
42 |
|
"obj_id1" => $obj_id1, |
|
43 |
|
"obj_id2" => $obj_id2); |
|
|
34 |
|
$key = 'watch' . '::' . $type . '::' . $uid |
|
35 |
|
. '::' . $obj_id1 . '::' . $obj_id2; |
|
36 |
|
$c = rg_cache_get($key); |
|
37 |
|
if ($c !== FALSE) { |
|
38 |
|
rg_log('DEBUG: c=' . $c . '.'); |
|
39 |
|
$ret = $c; |
|
40 |
|
break; |
|
41 |
|
} |
|
42 |
|
|
|
43 |
|
$params = array( |
|
44 |
|
'uid' => $uid, |
|
45 |
|
'obj_id1' => $obj_id1, |
|
46 |
|
'obj_id2' => $obj_id2); |
44 |
47 |
if (strcmp($type, "bug") == 0) { |
if (strcmp($type, "bug") == 0) { |
45 |
48 |
$sql = "SELECT 1 FROM watch_bug" |
$sql = "SELECT 1 FROM watch_bug" |
46 |
49 |
. " WHERE uid = @@uid@@" |
. " WHERE uid = @@uid@@" |
|
... |
... |
function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2) |
50 |
53 |
$sql = "SELECT 1 FROM watch_repo" |
$sql = "SELECT 1 FROM watch_repo" |
51 |
54 |
. " WHERE uid = @@uid@@" |
. " WHERE uid = @@uid@@" |
52 |
55 |
. " AND repo_id = @@obj_id1@@"; |
. " AND repo_id = @@obj_id1@@"; |
|
56 |
|
} else if (strcmp($type, "user") == 0) { |
|
57 |
|
$sql = "SELECT 1 FROM watch_user" |
|
58 |
|
. " WHERE uid = @@uid@@" |
|
59 |
|
. " AND watch_uid = @@obj_id1@@"; |
53 |
60 |
} else { |
} else { |
54 |
61 |
rg_internal_error("Invalid watch type!"); |
rg_internal_error("Invalid watch type!"); |
55 |
62 |
break; |
break; |
56 |
63 |
} |
} |
57 |
64 |
$res = rg_sql_query_params($db, $sql, $params); |
$res = rg_sql_query_params($db, $sql, $params); |
58 |
|
if ($res === FALSE) |
|
|
65 |
|
if ($res === FALSE) { |
|
66 |
|
rg_watch_set_error('cannot get data from db'); |
59 |
67 |
break; |
break; |
|
68 |
|
} |
60 |
69 |
|
|
61 |
70 |
$rows = rg_sql_num_rows($res); |
$rows = rg_sql_num_rows($res); |
62 |
71 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
63 |
72 |
|
|
64 |
73 |
$ret = $rows > 0 ? 1 : 0; |
$ret = $rows > 0 ? 1 : 0; |
65 |
|
$rg_watch_load_cache[$key] = $ret; |
|
|
74 |
|
|
|
75 |
|
rg_cache_set($key, $ret, RG_SOCKET_NO_WAIT); |
66 |
76 |
break; |
break; |
67 |
77 |
} |
} |
68 |
78 |
|
|
|
... |
... |
function rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2) |
74 |
84 |
/* |
/* |
75 |
85 |
* Add somebody to the watch list |
* Add somebody to the watch list |
76 |
86 |
*/ |
*/ |
77 |
|
$rg_watch_add_state = array(); |
|
78 |
|
function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2) |
|
|
87 |
|
function rg_watch_add($db, $type, $login_uid, $obj_id1, $obj_id2) |
79 |
88 |
{ |
{ |
80 |
89 |
global $rg_watch_add_state; |
global $rg_watch_add_state; |
81 |
90 |
|
|
82 |
|
// If watch already added, skip. |
|
83 |
|
$key = $type . "-" . $uid . "-" . $obj_id1 . "-" . $obj_id2; |
|
84 |
|
if (isset($rg_watch_add_state[$key])) |
|
85 |
|
return $rg_watch_add_state[$key]; |
|
86 |
|
|
|
87 |
91 |
rg_prof_start("watch_add"); |
rg_prof_start("watch_add"); |
88 |
|
rg_log_enter("watch_add type=$type, uid=$uid obj_id=$obj_id1/$obj_id2"); |
|
|
92 |
|
rg_log_enter("watch_add type=$type, login_uid=$login_uid" |
|
93 |
|
. " obj_id=$obj_id1/$obj_id2"); |
89 |
94 |
|
|
90 |
95 |
$ret = FALSE; |
$ret = FALSE; |
91 |
96 |
while (1) { |
while (1) { |
92 |
|
$r = rg_watch_load($db, $type, $uid, $obj_id1, $obj_id2); |
|
|
97 |
|
$r = rg_watch_load($db, $type, $login_uid, $obj_id1, $obj_id2); |
93 |
98 |
if ($r === FALSE) |
if ($r === FALSE) |
94 |
99 |
break; |
break; |
95 |
100 |
if ($r === 1) { // already in watch list |
if ($r === 1) { // already in watch list |
|
... |
... |
function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2) |
97 |
102 |
break; |
break; |
98 |
103 |
} |
} |
99 |
104 |
|
|
100 |
|
$params = array("uid" => $uid, |
|
|
105 |
|
$params = array("uid" => $login_uid, |
101 |
106 |
"obj_id1" => $obj_id1, |
"obj_id1" => $obj_id1, |
102 |
107 |
"obj_id2" => $obj_id2); |
"obj_id2" => $obj_id2); |
103 |
108 |
|
|
|
... |
... |
function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2) |
107 |
112 |
} else if (strcmp($type, "repo") == 0) { |
} else if (strcmp($type, "repo") == 0) { |
108 |
113 |
$sql = "INSERT INTO watch_repo (uid, repo_id)" |
$sql = "INSERT INTO watch_repo (uid, repo_id)" |
109 |
114 |
. " VALUES (@@uid@@, @@obj_id1@@)"; |
. " VALUES (@@uid@@, @@obj_id1@@)"; |
|
115 |
|
} else if (strcmp($type, "user") == 0) { |
|
116 |
|
$sql = "INSERT INTO watch_user (uid, watch_uid)" |
|
117 |
|
. " VALUES (@@uid@@, @@obj_id1@@)"; |
110 |
118 |
} else { |
} else { |
111 |
119 |
rg_internal_error("Invalid watch type!"); |
rg_internal_error("Invalid watch type!"); |
112 |
120 |
break; |
break; |
113 |
121 |
} |
} |
114 |
122 |
$res = rg_sql_query_params($db, $sql, $params); |
$res = rg_sql_query_params($db, $sql, $params); |
115 |
|
if ($res === FALSE) |
|
|
123 |
|
if ($res === FALSE) { |
|
124 |
|
rg_watch_set_error('cannot insert data in db'); |
116 |
125 |
break; |
break; |
|
126 |
|
} |
117 |
127 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
118 |
128 |
|
|
|
129 |
|
$key = 'watch' . '::' . $type . '::' . $login_uid |
|
130 |
|
. '::' . $obj_id1 . '::' . $obj_id2; |
|
131 |
|
rg_cache_set($key, 1, RG_SOCKET_NO_WAIT); |
|
132 |
|
|
119 |
133 |
$ret = TRUE; |
$ret = TRUE; |
120 |
134 |
break; |
break; |
121 |
135 |
} |
} |
122 |
136 |
|
|
123 |
|
$rg_watch_add_state[$key] = $ret; |
|
124 |
|
|
|
125 |
137 |
rg_log_exit(); |
rg_log_exit(); |
126 |
138 |
rg_prof_end("watch_add"); |
rg_prof_end("watch_add"); |
127 |
139 |
return $ret; |
return $ret; |
|
... |
... |
function rg_watch_add($db, $type, $uid, $obj_id1, $obj_id2) |
133 |
145 |
function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2) |
function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2) |
134 |
146 |
{ |
{ |
135 |
147 |
rg_prof_start("watch_del"); |
rg_prof_start("watch_del"); |
136 |
|
rg_log_enter("watch_del type=$type, login_uid=$login_uid obj_id=$obj_id1/$obj_id2"); |
|
|
148 |
|
rg_log_enter("watch_del type=$type, login_uid=$login_uid" |
|
149 |
|
. " obj_id=$obj_id1/$obj_id2"); |
137 |
150 |
|
|
138 |
151 |
$ret = FALSE; |
$ret = FALSE; |
139 |
152 |
while (1) { |
while (1) { |
|
153 |
|
$r = rg_watch_load($db, $type, $login_uid, $obj_id1, $obj_id2); |
|
154 |
|
if ($r === FALSE) |
|
155 |
|
break; |
|
156 |
|
if ($r === 0) { // already deleted |
|
157 |
|
rg_log('DEBUG: watch not active, nothing to do'); |
|
158 |
|
$ret = TRUE; |
|
159 |
|
break; |
|
160 |
|
} |
|
161 |
|
|
140 |
162 |
$params = array("login_uid" => $login_uid, |
$params = array("login_uid" => $login_uid, |
141 |
163 |
"obj_id1" => $obj_id1, |
"obj_id1" => $obj_id1, |
142 |
164 |
"obj_id2" => $obj_id2); |
"obj_id2" => $obj_id2); |
|
... |
... |
function rg_watch_del($db, $type, $login_uid, $obj_id1, $obj_id2) |
150 |
172 |
$sql = "DELETE FROM watch_repo" |
$sql = "DELETE FROM watch_repo" |
151 |
173 |
. " WHERE uid = @@login_uid@@" |
. " WHERE uid = @@login_uid@@" |
152 |
174 |
. " AND repo_id = @@obj_id1@@"; |
. " AND repo_id = @@obj_id1@@"; |
|
175 |
|
} else if (strcmp($type, "user") == 0) { |
|
176 |
|
$sql = "DELETE FROM watch_user" |
|
177 |
|
. " WHERE uid = @@login_uid@@" |
|
178 |
|
. " AND watch_uid = @@obj_id1@@"; |
153 |
179 |
} else { |
} else { |
154 |
180 |
rg_internal_error("Invalid watch type!"); |
rg_internal_error("Invalid watch type!"); |
155 |
181 |
break; |
break; |
156 |
182 |
} |
} |
157 |
183 |
$res = rg_sql_query_params($db, $sql, $params); |
$res = rg_sql_query_params($db, $sql, $params); |
158 |
|
if ($res === FALSE) |
|
|
184 |
|
if ($res === FALSE) { |
|
185 |
|
rg_watch_set_error('cannot delete data from db'); |
159 |
186 |
break; |
break; |
|
187 |
|
} |
160 |
188 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
161 |
189 |
|
|
|
190 |
|
$key = 'watch' . '::' . $type . '::' . $login_uid |
|
191 |
|
. '::' . $obj_id1 . '::' . $obj_id2; |
|
192 |
|
rg_cache_unset($key, RG_SOCKET_NO_WAIT); |
|
193 |
|
|
162 |
194 |
$ret = TRUE; |
$ret = TRUE; |
163 |
195 |
break; |
break; |
164 |
196 |
} |
} |
|
... |
... |
function rg_watch_load_by_obj_id($db, $type, $obj_id1, $obj_id2) |
188 |
220 |
} else if (strcmp($type, "repo") == 0) { |
} else if (strcmp($type, "repo") == 0) { |
189 |
221 |
$sql = "SELECT uid FROM watch_repo" |
$sql = "SELECT uid FROM watch_repo" |
190 |
222 |
. " WHERE repo_id = @@obj_id1@@"; |
. " WHERE repo_id = @@obj_id1@@"; |
|
223 |
|
} else if (strcmp($type, "user") == 0) { |
|
224 |
|
$sql = "SELECT uid FROM watch_user" |
|
225 |
|
. " WHERE watch_uid = @@obj_id1@@"; |
191 |
226 |
} else { |
} else { |
192 |
227 |
rg_internal_error("Invalid watch type!"); |
rg_internal_error("Invalid watch type!"); |
193 |
228 |
break; |
break; |
194 |
229 |
} |
} |
195 |
230 |
$res = rg_sql_query_params($db, $sql, $params); |
$res = rg_sql_query_params($db, $sql, $params); |
196 |
|
if ($res === FALSE) |
|
|
231 |
|
if ($res === FALSE) { |
|
232 |
|
rg_watch_set_error('cannot get data from db'); |
197 |
233 |
break; |
break; |
|
234 |
|
} |
198 |
235 |
|
|
199 |
236 |
$ret = array(); |
$ret = array(); |
200 |
|
while (($row = rg_sql_fetch_array($res))) { |
|
|
237 |
|
while (($row = rg_sql_fetch_array($res))) |
201 |
238 |
$ret[] = $row['uid']; |
$ret[] = $row['uid']; |
202 |
|
} |
|
203 |
239 |
rg_sql_free_result($res); |
rg_sql_free_result($res); |
204 |
240 |
|
|
205 |
241 |
break; |
break; |
|
... |
... |
function rg_watch_load_by_obj_id($db, $type, $obj_id1, $obj_id2) |
210 |
246 |
return $ret; |
return $ret; |
211 |
247 |
} |
} |
212 |
248 |
|
|
|
249 |
|
/* |
|
250 |
|
* Helper to easy dealing witch watch buttons. |
|
251 |
|
* It show and process the presses. |
|
252 |
|
*/ |
|
253 |
|
function rg_watch_hl_process($db, &$rg, $type, $obj_id1, $obj_id2, $url) |
|
254 |
|
{ |
|
255 |
|
rg_prof_start('watch_hl_process'); |
|
256 |
|
rg_log_enter('watch_hl_process'); |
|
257 |
|
|
|
258 |
|
$ret = FALSE; |
|
259 |
|
$rg['HTML:watch_form'] = ''; |
|
260 |
|
$rg['HTML:watch_error'] = ''; |
|
261 |
|
while (1) { |
|
262 |
|
// If user is not logged in, we cannot add a watch |
|
263 |
|
if ($rg['login_ui']['uid'] == 0) { |
|
264 |
|
$ret = TRUE; |
|
265 |
|
break; |
|
266 |
|
} |
|
267 |
|
|
|
268 |
|
// The owner is already watching his repos |
|
269 |
|
if ($rg['login_ui']['uid'] == $rg['page_ui']['uid']) { |
|
270 |
|
$ret = TRUE; |
|
271 |
|
break; |
|
272 |
|
} |
|
273 |
|
|
|
274 |
|
$watch = rg_watch_load($db, $type, $rg['login_ui']['uid'], |
|
275 |
|
$obj_id1, $obj_id2); |
|
276 |
|
if ($watch === FALSE) |
|
277 |
|
break; |
|
278 |
|
|
|
279 |
|
if (rg_var_uint('watch_doit') == 1) { |
|
280 |
|
if (!rg_valid_referer()) { |
|
281 |
|
rg_watch_set_error('invalid referer; try again'); |
|
282 |
|
break; |
|
283 |
|
} |
|
284 |
|
|
|
285 |
|
if (!rg_token_valid($db, $rg, 'watch', FALSE)) { |
|
286 |
|
rg_watch_set_error('invalid token; try again'); |
|
287 |
|
break; |
|
288 |
|
} |
|
289 |
|
|
|
290 |
|
if (rg_var_uint('watch') == $watch) |
|
291 |
|
$next_value = 1 - $watch; |
|
292 |
|
else |
|
293 |
|
$next_value = $watch; |
|
294 |
|
} else { |
|
295 |
|
$next_value = 1 - $watch; |
|
296 |
|
} |
|
297 |
|
|
|
298 |
|
rg_log('DEBUG: watch=' . $watch . ' next_value=' . $next_value); |
|
299 |
|
$rg['watch'] = array( |
|
300 |
|
'url' => $url, |
|
301 |
|
'next_value' => $next_value); |
|
302 |
|
$rg['rg_form_token_tag'] = 'watch'; |
|
303 |
|
$rg['rg_form_token'] = rg_token_get($db, $rg, 'watch'); |
|
304 |
|
$rg['HTML:watch_form'] = rg_template('watch.html', |
|
305 |
|
$rg, TRUE /*xss*/); |
|
306 |
|
|
|
307 |
|
if (rg_var_uint('watch_doit') != 1) { |
|
308 |
|
$ret = TRUE; |
|
309 |
|
break; |
|
310 |
|
} |
|
311 |
|
|
|
312 |
|
if ($watch == 0) |
|
313 |
|
$r = rg_watch_add($db, $type, $rg['login_ui']['uid'], |
|
314 |
|
$obj_id1, $obj_id2); |
|
315 |
|
else |
|
316 |
|
$r = rg_watch_del($db, $type, $rg['login_ui']['uid'], |
|
317 |
|
$obj_id1, $obj_id2); |
|
318 |
|
if ($r === FALSE) |
|
319 |
|
break; |
|
320 |
|
|
|
321 |
|
$ret = TRUE; |
|
322 |
|
break; |
|
323 |
|
} |
|
324 |
|
|
|
325 |
|
if ($ret === FALSE) |
|
326 |
|
$rg['HTML:watch_error'] = rg_warning('Watch error: ' . rg_watch_error()); |
|
327 |
|
|
|
328 |
|
rg_log_exit(); |
|
329 |
|
rg_prof_end('watch_hl_process'); |
|
330 |
|
return $ret; |
|
331 |
|
} |
|
332 |
|
|
213 |
333 |
?> |
?> |