phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / includes / functions_admin.php

History | View | Annotate | Download (88.5 kB)

1 2286 psotfx
<?php
2 7736 acydburn
/**
3 5114 acydburn
*
4 5553 acydburn
* @package acp
5 5114 acydburn
* @version $Id$
6 7736 acydburn
* @copyright (c) 2005 phpBB Group
7 7736 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5114 acydburn
*
9 5114 acydburn
*/
10 2286 psotfx
11 5114 acydburn
/**
12 8146 acydburn
* @ignore
13 8146 acydburn
*/
14 8146 acydburn
if (!defined('IN_PHPBB'))
15 8146 acydburn
{
16 8146 acydburn
        exit;
17 8146 acydburn
}
18 8146 acydburn
19 8146 acydburn
/**
20 9606 nickvergessen
* Recalculate Nested Sets
21 9605 nickvergessen
*
22 9605 nickvergessen
* @param int        $new_id        first left_id (should start with 1)
23 9605 nickvergessen
* @param string        $pkey        primary key-column (containing the id for the parent_id of the children)
24 9605 nickvergessen
* @param string        $table        constant or fullname of the table
25 9606 nickvergessen
* @param int        $parent_id parent_id of the current set (default = 0)
26 9605 nickvergessen
* @param array        $where        contains strings to compare closer on the where statement (additional)
27 9605 nickvergessen
*
28 9605 nickvergessen
* @author EXreaction
29 9605 nickvergessen
*/
30 9606 nickvergessen
function recalc_nested_sets(&$new_id, $pkey, $table, $parent_id = 0, $where = array())
31 5255 acydburn
{
32 5255 acydburn
        global $db;
33 5255 acydburn
34 9605 nickvergessen
        $sql = 'SELECT *
35 9605 nickvergessen
                FROM ' . $table . '
36 9605 nickvergessen
                WHERE parent_id = ' . (int) $parent_id .
37 9605 nickvergessen
                ((!empty($where)) ? ' AND ' . implode(' AND ', $where) : '') . '
38 9605 nickvergessen
                ORDER BY left_id ASC';
39 5272 acydburn
        $result = $db->sql_query($sql);
40 9605 nickvergessen
        while ($row = $db->sql_fetchrow($result))
41 5272 acydburn
        {
42 9605 nickvergessen
                // First we update the left_id for this module
43 9605 nickvergessen
                if ($row['left_id'] != $new_id)
44 5255 acydburn
                {
45 9605 nickvergessen
                        $db->sql_query('UPDATE ' . $table . ' SET ' . $db->sql_build_array('UPDATE', array('left_id' => $new_id)) . " WHERE $pkey = {$row[$pkey]}");
46 9605 nickvergessen
                }
47 9605 nickvergessen
                $new_id++;
48 5255 acydburn
49 9605 nickvergessen
                // Then we go through any children and update their left/right id's
50 9606 nickvergessen
                recalc_nested_sets($new_id, $pkey, $table, $row[$pkey], $where);
51 5255 acydburn
52 9605 nickvergessen
                // Then we come back and update the right_id for this module
53 9605 nickvergessen
                if ($row['right_id'] != $new_id)
54 5255 acydburn
                {
55 9605 nickvergessen
                        $db->sql_query('UPDATE ' . $table . ' SET ' . $db->sql_build_array('UPDATE', array('right_id' => $new_id)) . " WHERE $pkey = {$row[$pkey]}");
56 5255 acydburn
                }
57 9605 nickvergessen
                $new_id++;
58 5255 acydburn
        }
59 9605 nickvergessen
        $db->sql_freeresult($result);
60 5255 acydburn
}
61 5255 acydburn
62 5255 acydburn
/**
63 5114 acydburn
* Simple version of jumpbox, just lists authed forums
64 5114 acydburn
*/
65 6285 grahamje
function make_forum_select($select_id = false, $ignore_id = false, $ignore_acl = false, $ignore_nonpost = false, $ignore_emptycat = true, $only_acl_post = false, $return_array = false)
66 2286 psotfx
{
67 3099 psotfx
        global $db, $user, $auth;
68 2286 psotfx
69 5114 acydburn
        // This query is identical to the jumpbox one
70 9965 acydburn
        $sql = 'SELECT forum_id, forum_name, parent_id, forum_type, forum_flags, forum_options, left_id, right_id
71 5114 acydburn
                FROM ' . FORUMS_TABLE . '
72 5114 acydburn
                ORDER BY left_id ASC';
73 7599 davidmj
        $result = $db->sql_query($sql, 600);
74 5114 acydburn
75 6930 acydburn
        $right = 0;
76 3977 psotfx
        $padding_store = array('0' => '');
77 5517 acydburn
        $padding = '';
78 5517 acydburn
        $forum_list = ($return_array) ? array() : '';
79 4813 psotfx
80 5114 acydburn
        // Sometimes it could happen that forums will be displayed here not be displayed within the index page
81 5114 acydburn
        // This is the result of forums not displayed at index, having list permissions and a parent of a forum with no permissions.
82 5114 acydburn
        // If this happens, the padding could be "broken"
83 5114 acydburn
84 5114 acydburn
        while ($row = $db->sql_fetchrow($result))
85 2286 psotfx
        {
86 3099 psotfx
                if ($row['left_id'] < $right)
87 2944 psotfx
                {
88 5114 acydburn
                        $padding .= '&nbsp; &nbsp;';
89 3977 psotfx
                        $padding_store[$row['parent_id']] = $padding;
90 2944 psotfx
                }
91 3099 psotfx
                else if ($row['left_id'] > $right + 1)
92 3099 psotfx
                {
93 4898 acydburn
                        $padding = (isset($padding_store[$row['parent_id']])) ? $padding_store[$row['parent_id']] : '';
94 3099 psotfx
                }
95 2942 psotfx
96 2944 psotfx
                $right = $row['right_id'];
97 6930 acydburn
                $disabled = false;
98 2942 psotfx
99 10623 git-gate
                if (!$ignore_acl && $auth->acl_gets(array('f_list', 'a_forum', 'a_forumadd', 'a_forumdel'), $row['forum_id']))
100 5114 acydburn
                {
101 10427 jelly_doughnut
                        if ($only_acl_post && !$auth->acl_get('f_post', $row['forum_id']) || (!$auth->acl_get('m_approve', $row['forum_id']) && !$auth->acl_get('f_noapprove', $row['forum_id'])))
102 6930 acydburn
                        {
103 6930 acydburn
                                $disabled = true;
104 6930 acydburn
                        }
105 5114 acydburn
                }
106 10427 jelly_doughnut
                else if (!$ignore_acl)
107 10427 jelly_doughnut
                {
108 10427 jelly_doughnut
                        continue;
109 10427 jelly_doughnut
                }
110 3099 psotfx
111 6930 acydburn
                if (
112 6930 acydburn
                        ((is_array($ignore_id) && in_array($row['forum_id'], $ignore_id)) || $row['forum_id'] == $ignore_id)
113 6930 acydburn
                        ||
114 5114 acydburn
                        // Non-postable forum with no subforums, don't display
115 6930 acydburn
                        ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']) && $ignore_emptycat)
116 6930 acydburn
                        ||
117 6930 acydburn
                        ($row['forum_type'] != FORUM_POST && $ignore_nonpost)
118 6930 acydburn
                        )
119 3099 psotfx
                {
120 6930 acydburn
                        $disabled = true;
121 3099 psotfx
                }
122 3099 psotfx
123 5517 acydburn
                if ($return_array)
124 5517 acydburn
                {
125 6650 acydburn
                        // Include some more information...
126 5517 acydburn
                        $selected = (is_array($select_id)) ? ((in_array($row['forum_id'], $select_id)) ? true : false) : (($row['forum_id'] == $select_id) ? true : false);
127 6930 acydburn
                        $forum_list[$row['forum_id']] = array_merge(array('padding' => $padding, 'selected' => ($selected && !$disabled), 'disabled' => $disabled), $row);
128 5517 acydburn
                }
129 5517 acydburn
                else
130 5517 acydburn
                {
131 5517 acydburn
                        $selected = (is_array($select_id)) ? ((in_array($row['forum_id'], $select_id)) ? ' selected="selected"' : '') : (($row['forum_id'] == $select_id) ? ' selected="selected"' : '');
132 7456 acydburn
                        $forum_list .= '<option value="' . $row['forum_id'] . '"' . (($disabled) ? ' disabled="disabled" class="disabled-option"' : $selected) . '>' . $padding . $row['forum_name'] . '</option>';
133 5517 acydburn
                }
134 3099 psotfx
        }
135 5929 acydburn
        $db->sql_freeresult($result);
136 5114 acydburn
        unset($padding_store);
137 3099 psotfx
138 3099 psotfx
        return $forum_list;
139 2286 psotfx
}
140 2286 psotfx
141 5114 acydburn
/**
142 6015 acydburn
* Generate size select options
143 5114 acydburn
*/
144 5486 acydburn
function size_select_options($size_compare)
145 4634 acydburn
{
146 4634 acydburn
        global $user;
147 4634 acydburn
148 8389 acydburn
        $size_types_text = array($user->lang['BYTES'], $user->lang['KIB'], $user->lang['MIB']);
149 4634 acydburn
        $size_types = array('b', 'kb', 'mb');
150 4634 acydburn
151 5486 acydburn
        $s_size_options = '';
152 6015 acydburn
153 4984 acydburn
        for ($i = 0, $size = sizeof($size_types_text); $i < $size; $i++)
154 4634 acydburn
        {
155 4634 acydburn
                $selected = ($size_compare == $size_types[$i]) ? ' selected="selected"' : '';
156 5486 acydburn
                $s_size_options .= '<option value="' . $size_types[$i] . '"' . $selected . '>' . $size_types_text[$i] . '</option>';
157 4634 acydburn
        }
158 6015 acydburn
159 5486 acydburn
        return $s_size_options;
160 5486 acydburn
}
161 4634 acydburn
162 5486 acydburn
/**
163 6816 acydburn
* Generate list of groups (option fields without select)
164 6816 acydburn
*
165 6816 acydburn
* @param int $group_id The default group id to mark as selected
166 6816 acydburn
* @param array $exclude_ids The group ids to exclude from the list, false (default) if you whish to exclude no id
167 6816 acydburn
* @param int $manage_founder If set to false (default) all groups are returned, if 0 only those groups returned not being managed by founders only, if 1 only those groups returned managed by founders only.
168 6816 acydburn
*
169 6816 acydburn
* @return string The list of options.
170 5486 acydburn
*/
171 6816 acydburn
function group_select_options($group_id, $exclude_ids = false, $manage_founder = false)
172 5486 acydburn
{
173 5744 acydburn
        global $db, $user, $config;
174 5486 acydburn
175 6271 acydburn
        $exclude_sql = ($exclude_ids !== false && sizeof($exclude_ids)) ? 'WHERE ' . $db->sql_in_set('group_id', array_map('intval', $exclude_ids), true) : '';
176 6436 acydburn
        $sql_and = (!$config['coppa_enable']) ? (($exclude_sql) ? ' AND ' : ' WHERE ') . "group_name <> 'REGISTERED_COPPA'" : '';
177 6816 acydburn
        $sql_founder = ($manage_founder !== false) ? (($exclude_sql || $sql_and) ? ' AND ' : ' WHERE ') . 'group_founder_manage = ' . (int) $manage_founder : '';
178 5744 acydburn
179 8146 acydburn
        $sql = 'SELECT group_id, group_name, group_type
180 5744 acydburn
                FROM ' . GROUPS_TABLE . "
181 5744 acydburn
                $exclude_sql
182 5744 acydburn
                $sql_and
183 6816 acydburn
                $sql_founder
184 5744 acydburn
                ORDER BY group_type DESC, group_name ASC";
185 5486 acydburn
        $result = $db->sql_query($sql);
186 5486 acydburn
187 5486 acydburn
        $s_group_options = '';
188 5486 acydburn
        while ($row = $db->sql_fetchrow($result))
189 5486 acydburn
        {
190 5486 acydburn
                $selected = ($row['group_id'] == $group_id) ? ' selected="selected"' : '';
191 5486 acydburn
                $s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '"' . $selected . '>' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>';
192 5486 acydburn
        }
193 5486 acydburn
        $db->sql_freeresult($result);
194 6015 acydburn
195 5486 acydburn
        return $s_group_options;
196 4634 acydburn
}
197 4634 acydburn
198 5114 acydburn
/**
199 5114 acydburn
* Obtain authed forums list
200 5114 acydburn
*/
201 5313 acydburn
function get_forum_list($acl_list = 'f_list', $id_only = true, $postable_only = false, $no_cache = false)
202 3781 ludovic_arnaud
{
203 3833 psotfx
        global $db, $auth;
204 3781 ludovic_arnaud
        static $forum_rows;
205 3781 ludovic_arnaud
206 3781 ludovic_arnaud
        if (!isset($forum_rows))
207 3781 ludovic_arnaud
        {
208 3781 ludovic_arnaud
                // This query is identical to the jumpbox one
209 7327 davidmj
                $expire_time = ($no_cache) ? 0 : 600;
210 6015 acydburn
211 6135 acydburn
                $sql = 'SELECT forum_id, forum_name, parent_id, forum_type, left_id, right_id
212 3781 ludovic_arnaud
                        FROM ' . FORUMS_TABLE . '
213 3781 ludovic_arnaud
                        ORDER BY left_id ASC';
214 3781 ludovic_arnaud
                $result = $db->sql_query($sql, $expire_time);
215 4813 psotfx
216 6436 acydburn
                $forum_rows = array();
217 7775 davidmj
218 7775 davidmj
                $right = $padding = 0;
219 7775 davidmj
                $padding_store = array('0' => 0);
220 7775 davidmj
221 3781 ludovic_arnaud
                while ($row = $db->sql_fetchrow($result))
222 3781 ludovic_arnaud
                {
223 7775 davidmj
                        if ($row['left_id'] < $right)
224 7775 davidmj
                        {
225 7775 davidmj
                                $padding++;
226 7775 davidmj
                                $padding_store[$row['parent_id']] = $padding;
227 7775 davidmj
                        }
228 7775 davidmj
                        else if ($row['left_id'] > $right + 1)
229 7775 davidmj
                        {
230 7775 davidmj
                                // Ok, if the $padding_store for this parent is empty there is something wrong. For now we will skip over it.
231 7775 davidmj
                                // @todo digging deep to find out "how" this can happen.
232 7775 davidmj
                                $padding = (isset($padding_store[$row['parent_id']])) ? $padding_store[$row['parent_id']] : $padding;
233 7775 davidmj
                        }
234 7775 davidmj
235 7775 davidmj
                        $right = $row['right_id'];
236 7775 davidmj
                        $row['padding'] = $padding;
237 7775 davidmj
238 3781 ludovic_arnaud
                        $forum_rows[] = $row;
239 3781 ludovic_arnaud
                }
240 5494 acydburn
                $db->sql_freeresult($result);
241 7775 davidmj
                unset($padding_store);
242 3781 ludovic_arnaud
        }
243 3781 ludovic_arnaud
244 3781 ludovic_arnaud
        $rowset = array();
245 3781 ludovic_arnaud
        foreach ($forum_rows as $row)
246 3781 ludovic_arnaud
        {
247 4671 ludovic_arnaud
                if ($postable_only && $row['forum_type'] != FORUM_POST)
248 3781 ludovic_arnaud
                {
249 3781 ludovic_arnaud
                        continue;
250 3781 ludovic_arnaud
                }
251 3833 psotfx
252 3833 psotfx
                if ($acl_list == '' || ($acl_list != '' && $auth->acl_gets($acl_list, $row['forum_id'])))
253 3781 ludovic_arnaud
                {
254 10159 bantu
                        $rowset[] = ($id_only) ? (int) $row['forum_id'] : $row;
255 3781 ludovic_arnaud
                }
256 3781 ludovic_arnaud
        }
257 3781 ludovic_arnaud
258 3781 ludovic_arnaud
        return $rowset;
259 3781 ludovic_arnaud
}
260 3781 ludovic_arnaud
261 5114 acydburn
/**
262 5114 acydburn
* Get forum branch
263 5114 acydburn
*/
264 5313 acydburn
function get_forum_branch($forum_id, $type = 'all', $order = 'descending', $include_forum = true)
265 4039 ludovic_arnaud
{
266 4039 ludovic_arnaud
        global $db;
267 4039 ludovic_arnaud
268 4039 ludovic_arnaud
        switch ($type)
269 4039 ludovic_arnaud
        {
270 4039 ludovic_arnaud
                case 'parents':
271 4039 ludovic_arnaud
                        $condition = 'f1.left_id BETWEEN f2.left_id AND f2.right_id';
272 6015 acydburn
                break;
273 4039 ludovic_arnaud
274 4039 ludovic_arnaud
                case 'children':
275 4039 ludovic_arnaud
                        $condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id';
276 6015 acydburn
                break;
277 4039 ludovic_arnaud
278 4039 ludovic_arnaud
                default:
279 4039 ludovic_arnaud
                        $condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id OR f1.left_id BETWEEN f2.left_id AND f2.right_id';
280 6015 acydburn
                break;
281 4039 ludovic_arnaud
        }
282 4039 ludovic_arnaud
283 4039 ludovic_arnaud
        $rows = array();
284 4039 ludovic_arnaud
285 4039 ludovic_arnaud
        $sql = 'SELECT f2.*
286 5313 acydburn
                FROM ' . FORUMS_TABLE . ' f1
287 5313 acydburn
                LEFT JOIN ' . FORUMS_TABLE . " f2 ON ($condition)
288 4039 ludovic_arnaud
                WHERE f1.forum_id = $forum_id
289 4039 ludovic_arnaud
                ORDER BY f2.left_id " . (($order == 'descending') ? 'ASC' : 'DESC');
290 4039 ludovic_arnaud
        $result = $db->sql_query($sql);
291 4039 ludovic_arnaud
292 4039 ludovic_arnaud
        while ($row = $db->sql_fetchrow($result))
293 4039 ludovic_arnaud
        {
294 4039 ludovic_arnaud
                if (!$include_forum && $row['forum_id'] == $forum_id)
295 4039 ludovic_arnaud
                {
296 4039 ludovic_arnaud
                        continue;
297 4039 ludovic_arnaud
                }
298 4039 ludovic_arnaud
299 4039 ludovic_arnaud
                $rows[] = $row;
300 4039 ludovic_arnaud
        }
301 4039 ludovic_arnaud
        $db->sql_freeresult($result);
302 4039 ludovic_arnaud
303 4039 ludovic_arnaud
        return $rows;
304 4039 ludovic_arnaud
}
305 4039 ludovic_arnaud
306 5114 acydburn
/**
307 9887 bantu
* Copies permissions from one forum to others
308 9887 bantu
*
309 9887 bantu
* @param int        $src_forum_id                The source forum we want to copy permissions from
310 9887 bantu
* @param array        $dest_forum_ids                The destination forum(s) we want to copy to
311 9887 bantu
* @param bool        $clear_dest_perms        True if destination permissions should be deleted
312 9887 bantu
* @param bool        $add_log                        True if log entry should be added
313 9887 bantu
*
314 9887 bantu
* @return bool                                                False on error
315 9887 bantu
*
316 9887 bantu
* @author bantu
317 9887 bantu
*/
318 9887 bantu
function copy_forum_permissions($src_forum_id, $dest_forum_ids, $clear_dest_perms = true, $add_log = true)
319 9887 bantu
{
320 9887 bantu
        global $db;
321 9887 bantu
322 9887 bantu
        // Only one forum id specified
323 9887 bantu
        if (!is_array($dest_forum_ids))
324 9887 bantu
        {
325 9887 bantu
                $dest_forum_ids = array($dest_forum_ids);
326 9887 bantu
        }
327 9887 bantu
328 9887 bantu
        // Make sure forum ids are integers
329 9887 bantu
        $src_forum_id = (int) $src_forum_id;
330 9887 bantu
        $dest_forum_ids = array_map('intval', $dest_forum_ids);
331 9887 bantu
332 9887 bantu
        // No source forum or no destination forums specified
333 9887 bantu
        if (empty($src_forum_id) || empty($dest_forum_ids))
334 9887 bantu
        {
335 9887 bantu
                return false;
336 9887 bantu
        }
337 9887 bantu
338 10042 terrafrost
        // Check if source forum exists
339 9887 bantu
        $sql = 'SELECT forum_name
340 9887 bantu
                FROM ' . FORUMS_TABLE . '
341 9887 bantu
                WHERE forum_id = ' . $src_forum_id;
342 9887 bantu
        $result = $db->sql_query($sql);
343 9887 bantu
        $src_forum_name = $db->sql_fetchfield('forum_name');
344 10042 terrafrost
        $db->sql_freeresult($result);
345 9887 bantu
346 9887 bantu
        // Source forum doesn't exist
347 9887 bantu
        if (empty($src_forum_name))
348 9887 bantu
        {
349 9887 bantu
                return false;
350 9887 bantu
        }
351 9887 bantu
352 9887 bantu
        // Check if destination forums exists
353 9887 bantu
        $sql = 'SELECT forum_id, forum_name
354 9887 bantu
                FROM ' . FORUMS_TABLE . '
355 9887 bantu
                WHERE ' . $db->sql_in_set('forum_id', $dest_forum_ids);
356 9887 bantu
        $result = $db->sql_query($sql);
357 9887 bantu
358 10042 terrafrost
        $dest_forum_ids = $dest_forum_names = array();
359 9887 bantu
        while ($row = $db->sql_fetchrow($result))
360 9887 bantu
        {
361 9887 bantu
                $dest_forum_ids[]        = (int) $row['forum_id'];
362 9887 bantu
                $dest_forum_names[]        = $row['forum_name'];
363 9887 bantu
        }
364 9887 bantu
        $db->sql_freeresult($result);
365 9887 bantu
366 9887 bantu
        // No destination forum exists
367 9887 bantu
        if (empty($dest_forum_ids))
368 9887 bantu
        {
369 9887 bantu
                return false;
370 9887 bantu
        }
371 9887 bantu
372 9887 bantu
        // From the mysql documentation:
373 9887 bantu
        // Prior to MySQL 4.0.14, the target table of the INSERT statement cannot appear
374 9887 bantu
        // in the FROM clause of the SELECT part of the query. This limitation is lifted in 4.0.14.
375 9887 bantu
        // Due to this we stay on the safe side if we do the insertion "the manual way"
376 9887 bantu
377 9887 bantu
        // Rowsets we're going to insert
378 9887 bantu
        $users_sql_ary = $groups_sql_ary = array();
379 9887 bantu
380 9887 bantu
        // Query acl users table for source forum data
381 9887 bantu
        $sql = 'SELECT user_id, auth_option_id, auth_role_id, auth_setting
382 9887 bantu
                FROM ' . ACL_USERS_TABLE . '
383 9887 bantu
                WHERE forum_id = ' . $src_forum_id;
384 9887 bantu
        $result = $db->sql_query($sql);
385 9887 bantu
386 9887 bantu
        while ($row = $db->sql_fetchrow($result))
387 9887 bantu
        {
388 9887 bantu
                $row = array(
389 9887 bantu
                        'user_id'                        => (int) $row['user_id'],
390 9887 bantu
                        'auth_option_id'        => (int) $row['auth_option_id'],
391 9887 bantu
                        'auth_role_id'                => (int) $row['auth_role_id'],
392 9887 bantu
                        'auth_setting'                => (int) $row['auth_setting'],
393 9887 bantu
                );
394 9887 bantu
395 9887 bantu
                foreach ($dest_forum_ids as $dest_forum_id)
396 9887 bantu
                {
397 9887 bantu
                        $users_sql_ary[] = $row + array('forum_id' => $dest_forum_id);
398 9887 bantu
                }
399 9887 bantu
        }
400 9887 bantu
        $db->sql_freeresult($result);
401 9887 bantu
402 9887 bantu
        // Query acl groups table for source forum data
403 9887 bantu
        $sql = 'SELECT group_id, auth_option_id, auth_role_id, auth_setting
404 9887 bantu
                FROM ' . ACL_GROUPS_TABLE . '
405 9887 bantu
                WHERE forum_id = ' . $src_forum_id;
406 9887 bantu
        $result = $db->sql_query($sql);
407 9887 bantu
408 9887 bantu
        while ($row = $db->sql_fetchrow($result))
409 9887 bantu
        {
410 9887 bantu
                $row = array(
411 9887 bantu
                        'group_id'                        => (int) $row['group_id'],
412 9887 bantu
                        'auth_option_id'        => (int) $row['auth_option_id'],
413 9887 bantu
                        'auth_role_id'                => (int) $row['auth_role_id'],
414 9887 bantu
                        'auth_setting'                => (int) $row['auth_setting'],
415 9887 bantu
                );
416 9887 bantu
417 9887 bantu
                foreach ($dest_forum_ids as $dest_forum_id)
418 9887 bantu
                {
419 9887 bantu
                        $groups_sql_ary[] = $row + array('forum_id' => $dest_forum_id);
420 9887 bantu
                }
421 9887 bantu
        }
422 9887 bantu
        $db->sql_freeresult($result);
423 9887 bantu
424 9887 bantu
        $db->sql_transaction('begin');
425 9887 bantu
426 9887 bantu
        // Clear current permissions of destination forums
427 9887 bantu
        if ($clear_dest_perms)
428 9887 bantu
        {
429 9887 bantu
                $sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
430 9887 bantu
                        WHERE ' . $db->sql_in_set('forum_id', $dest_forum_ids);
431 9887 bantu
                $db->sql_query($sql);
432 9887 bantu
433 9887 bantu
                $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
434 9887 bantu
                        WHERE ' . $db->sql_in_set('forum_id', $dest_forum_ids);
435 9887 bantu
                $db->sql_query($sql);
436 9887 bantu
        }
437 9887 bantu
438 9887 bantu
        $db->sql_multi_insert(ACL_USERS_TABLE, $users_sql_ary);
439 9887 bantu
        $db->sql_multi_insert(ACL_GROUPS_TABLE, $groups_sql_ary);
440 9887 bantu
441 9887 bantu
        if ($add_log)
442 9887 bantu
        {
443 9887 bantu
                add_log('admin', 'LOG_FORUM_COPIED_PERMISSIONS', $src_forum_name, implode(', ', $dest_forum_names));
444 9887 bantu
        }
445 9887 bantu
446 9887 bantu
        $db->sql_transaction('commit');
447 9887 bantu
448 9887 bantu
        return true;
449 9887 bantu
}
450 9887 bantu
451 9887 bantu
/**
452 5114 acydburn
* Get physical file listing
453 5114 acydburn
*/
454 4090 psotfx
function filelist($rootdir, $dir = '', $type = 'gif|jpg|jpeg|png')
455 4326 psotfx
{
456 9565 bantu
        $matches = array($dir => array());
457 4090 psotfx
458 4354 psotfx
        // Remove initial / if present
459 4354 psotfx
        $rootdir = (substr($rootdir, 0, 1) == '/') ? substr($rootdir, 1) : $rootdir;
460 6015 acydburn
        // Add closing / if not present
461 4354 psotfx
        $rootdir = ($rootdir && substr($rootdir, -1) != '/') ? $rootdir . '/' : $rootdir;
462 4354 psotfx
463 4354 psotfx
        // Remove initial / if present
464 4354 psotfx
        $dir = (substr($dir, 0, 1) == '/') ? substr($dir, 1) : $dir;
465 6015 acydburn
        // Add closing / if not present
466 4354 psotfx
        $dir = ($dir && substr($dir, -1) != '/') ? $dir . '/' : $dir;
467 4354 psotfx
468 5315 acydburn
        if (!is_dir($rootdir . $dir))
469 5315 acydburn
        {
470 7884 acydburn
                return $matches;
471 5315 acydburn
        }
472 5315 acydburn
473 6912 acydburn
        $dh = @opendir($rootdir . $dir);
474 6912 acydburn
475 6912 acydburn
        if (!$dh)
476 6912 acydburn
        {
477 7884 acydburn
                return $matches;
478 6912 acydburn
        }
479 6912 acydburn
480 4430 psotfx
        while (($fname = readdir($dh)) !== false)
481 4090 psotfx
        {
482 4354 psotfx
                if (is_file("$rootdir$dir$fname"))
483 4090 psotfx
                {
484 4354 psotfx
                        if (filesize("$rootdir$dir$fname") && preg_match('#\.' . $type . '$#i', $fname))
485 4354 psotfx
                        {
486 4354 psotfx
                                $matches[$dir][] = $fname;
487 4354 psotfx
                        }
488 4090 psotfx
                }
489 6459 acydburn
                else if ($fname[0] != '.' && is_dir("$rootdir$dir$fname"))
490 4090 psotfx
                {
491 4354 psotfx
                        $matches += filelist($rootdir, "$dir$fname", $type);
492 4090 psotfx
                }
493 4090 psotfx
        }
494 4090 psotfx
        closedir($dh);
495 4090 psotfx
496 4090 psotfx
        return $matches;
497 4090 psotfx
}
498 4090 psotfx
499 6152 naderman
/**
500 5114 acydburn
* Move topic(s)
501 5114 acydburn
*/
502 4920 acydburn
function move_topics($topic_ids, $forum_id, $auto_sync = true)
503 2286 psotfx
{
504 2286 psotfx
        global $db;
505 2286 psotfx
506 5933 acydburn
        if (empty($topic_ids))
507 5933 acydburn
        {
508 5933 acydburn
                return;
509 5933 acydburn
        }
510 5933 acydburn
511 3737 ludovic_arnaud
        $forum_ids = array($forum_id);
512 6015 acydburn
513 5933 acydburn
        if (!is_array($topic_ids))
514 5933 acydburn
        {
515 5933 acydburn
                $topic_ids = array($topic_ids);
516 5933 acydburn
        }
517 3737 ludovic_arnaud
518 5933 acydburn
        $sql = 'DELETE FROM ' . TOPICS_TABLE . '
519 6271 acydburn
                WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids) . '
520 5933 acydburn
                        AND forum_id = ' . $forum_id;
521 3961 psotfx
        $db->sql_query($sql);
522 3961 psotfx
523 3737 ludovic_arnaud
        if ($auto_sync)
524 2286 psotfx
        {
525 3737 ludovic_arnaud
                $sql = 'SELECT DISTINCT forum_id
526 3737 ludovic_arnaud
                        FROM ' . TOPICS_TABLE . '
527 6271 acydburn
                        WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
528 3737 ludovic_arnaud
                $result = $db->sql_query($sql);
529 3961 psotfx
530 3737 ludovic_arnaud
                while ($row = $db->sql_fetchrow($result))
531 3737 ludovic_arnaud
                {
532 3737 ludovic_arnaud
                        $forum_ids[] = $row['forum_id'];
533 3737 ludovic_arnaud
                }
534 3961 psotfx
                $db->sql_freeresult($result);
535 4920 acydburn
        }
536 5933 acydburn
537 5933 acydburn
        $table_ary = array(TOPICS_TABLE, POSTS_TABLE, LOG_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE);
538 4920 acydburn
        foreach ($table_ary as $table)
539 4920 acydburn
        {
540 4920 acydburn
                $sql = "UPDATE $table
541 4920 acydburn
                        SET forum_id = $forum_id
542 6271 acydburn
                        WHERE " . $db->sql_in_set('topic_id', $topic_ids);
543 4920 acydburn
                $db->sql_query($sql);
544 4920 acydburn
        }
545 4920 acydburn
        unset($table_ary);
546 3737 ludovic_arnaud
547 4920 acydburn
        if ($auto_sync)
548 4920 acydburn
        {
549 7466 davidmj
                sync('forum', 'forum_id', $forum_ids, true, true);
550 3961 psotfx
                unset($forum_ids);
551 3737 ludovic_arnaud
        }
552 3737 ludovic_arnaud
}
553 3737 ludovic_arnaud
554 5114 acydburn
/**
555 5114 acydburn
* Move post(s)
556 5114 acydburn
*/
557 4923 acydburn
function move_posts($post_ids, $topic_id, $auto_sync = true)
558 3737 ludovic_arnaud
{
559 3737 ludovic_arnaud
        global $db;
560 3961 psotfx
561 3737 ludovic_arnaud
        if (!is_array($post_ids))
562 3737 ludovic_arnaud
        {
563 3737 ludovic_arnaud
                $post_ids = array($post_ids);
564 3737 ludovic_arnaud
        }
565 3737 ludovic_arnaud
566 5933 acydburn
        $forum_ids = array();
567 5933 acydburn
        $topic_ids = array($topic_id);
568 3737 ludovic_arnaud
569 5933 acydburn
        $sql = 'SELECT DISTINCT topic_id, forum_id
570 5933 acydburn
                FROM ' . POSTS_TABLE . '
571 6271 acydburn
                WHERE ' . $db->sql_in_set('post_id', $post_ids);
572 5933 acydburn
        $result = $db->sql_query($sql);
573 3961 psotfx
574 5933 acydburn
        while ($row = $db->sql_fetchrow($result))
575 5933 acydburn
        {
576 10712 git-gate
                $forum_ids[] = (int) $row['forum_id'];
577 10712 git-gate
                $topic_ids[] = (int) $row['topic_id'];
578 3737 ludovic_arnaud
        }
579 5933 acydburn
        $db->sql_freeresult($result);
580 3737 ludovic_arnaud
581 8146 acydburn
        $sql = 'SELECT forum_id
582 8146 acydburn
                FROM ' . TOPICS_TABLE . '
583 3961 psotfx
                WHERE topic_id = ' . $topic_id;
584 3737 ludovic_arnaud
        $result = $db->sql_query($sql);
585 5933 acydburn
        $forum_row = $db->sql_fetchrow($result);
586 5933 acydburn
        $db->sql_freeresult($result);
587 3961 psotfx
588 5933 acydburn
        if (!$forum_row)
589 3737 ludovic_arnaud
        {
590 3961 psotfx
                trigger_error('NO_TOPIC');
591 3737 ludovic_arnaud
        }
592 3737 ludovic_arnaud
593 3737 ludovic_arnaud
        $sql = 'UPDATE ' . POSTS_TABLE . '
594 10712 git-gate
                SET forum_id = ' . (int) $forum_row['forum_id'] . ", topic_id = $topic_id
595 6271 acydburn
                WHERE " . $db->sql_in_set('post_id', $post_ids);
596 3737 ludovic_arnaud
        $db->sql_query($sql);
597 3737 ludovic_arnaud
598 4677 acydburn
        $sql = 'UPDATE ' . ATTACHMENTS_TABLE . "
599 5933 acydburn
                SET topic_id = $topic_id, in_message = 0
600 6271 acydburn
                WHERE " . $db->sql_in_set('post_msg_id', $post_ids);
601 4677 acydburn
        $db->sql_query($sql);
602 4677 acydburn
603 3737 ludovic_arnaud
        if ($auto_sync)
604 3737 ludovic_arnaud
        {
605 10712 git-gate
                $forum_ids[] = (int) $forum_row['forum_id'];
606 3737 ludovic_arnaud
607 5622 acydburn
                sync('topic_reported', 'topic_id', $topic_ids);
608 6266 naderman
                sync('topic_attachment', 'topic_id', $topic_ids);
609 8081 davidmj
                sync('topic', 'topic_id', $topic_ids, true);
610 7466 davidmj
                sync('forum', 'forum_id', $forum_ids, true, true);
611 3737 ludovic_arnaud
        }
612 5933 acydburn
613 6650 acydburn
        // Update posted information
614 5933 acydburn
        update_posted_info($topic_ids);
615 3737 ludovic_arnaud
}
616 3737 ludovic_arnaud
617 5114 acydburn
/**
618 5114 acydburn
* Remove topic(s)
619 5114 acydburn
*/
620 7221 acydburn
function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_sync = true, $call_delete_posts = true)
621 3737 ludovic_arnaud
{
622 6149 acydburn
        global $db, $config;
623 6015 acydburn
624 6584 acydburn
        $approved_topics = 0;
625 3737 ludovic_arnaud
        $forum_ids = $topic_ids = array();
626 3737 ludovic_arnaud
627 7000 davidmj
        if ($where_type === 'range')
628 3737 ludovic_arnaud
        {
629 7000 davidmj
                $where_clause = $where_ids;
630 3737 ludovic_arnaud
        }
631 6271 acydburn
        else
632 6271 acydburn
        {
633 7114 acydburn
                $where_ids = (is_array($where_ids)) ? array_unique($where_ids) : array($where_ids);
634 7066 davidmj
635 7066 davidmj
                if (!sizeof($where_ids))
636 7066 davidmj
                {
637 7066 davidmj
                        return array('topics' => 0, 'posts' => 0);
638 7066 davidmj
                }
639 7066 davidmj
640 7000 davidmj
                $where_clause = $db->sql_in_set($where_type, $where_ids);
641 6271 acydburn
        }
642 3961 psotfx
643 7221 acydburn
        // Making sure that delete_posts does not call delete_topics again...
644 3737 ludovic_arnaud
        $return = array(
645 7221 acydburn
                'posts' => ($call_delete_posts) ? delete_posts($where_type, $where_ids, false, true, $post_count_sync, false) : 0,
646 3737 ludovic_arnaud
        );
647 3737 ludovic_arnaud
648 8836 toonarmy
        $sql = 'SELECT topic_id, forum_id, topic_approved, topic_moved_id
649 6271 acydburn
                FROM ' . TOPICS_TABLE . '
650 7001 davidmj
                WHERE ' . $where_clause;
651 3961 psotfx
        $result = $db->sql_query($sql);
652 3737 ludovic_arnaud
653 3737 ludovic_arnaud
        while ($row = $db->sql_fetchrow($result))
654 3737 ludovic_arnaud
        {
655 3737 ludovic_arnaud
                $forum_ids[] = $row['forum_id'];
656 3737 ludovic_arnaud
                $topic_ids[] = $row['topic_id'];
657 6584 acydburn
658 8836 toonarmy
                if ($row['topic_approved'] && !$row['topic_moved_id'])
659 6584 acydburn
                {
660 6584 acydburn
                        $approved_topics++;
661 6584 acydburn
                }
662 3737 ludovic_arnaud
        }
663 6345 acydburn
        $db->sql_freeresult($result);
664 3737 ludovic_arnaud
665 4920 acydburn
        $return['topics'] = sizeof($topic_ids);
666 3737 ludovic_arnaud
667 4920 acydburn
        if (!sizeof($topic_ids))
668 3737 ludovic_arnaud
        {
669 3737 ludovic_arnaud
                return $return;
670 3737 ludovic_arnaud
        }
671 3737 ludovic_arnaud
672 3737 ludovic_arnaud
        $db->sql_transaction('begin');
673 3961 psotfx
674 10621 git-gate
        $table_ary = array(BOOKMARKS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, POLL_VOTES_TABLE, POLL_OPTIONS_TABLE, TOPICS_WATCH_TABLE, TOPICS_TABLE);
675 5973 acydburn
676 3961 psotfx
        foreach ($table_ary as $table)
677 3961 psotfx
        {
678 8146 acydburn
                $sql = "DELETE FROM $table
679 6271 acydburn
                        WHERE " . $db->sql_in_set('topic_id', $topic_ids);
680 3961 psotfx
                $db->sql_query($sql);
681 3961 psotfx
        }
682 3961 psotfx
        unset($table_ary);
683 3961 psotfx
684 7679 davidmj
        $moved_topic_ids = array();
685 7679 davidmj
686 7679 davidmj
        // update the other forums
687 7679 davidmj
        $sql = 'SELECT topic_id, forum_id
688 7679 davidmj
                FROM ' . TOPICS_TABLE . '
689 6271 acydburn
                WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids);
690 7679 davidmj
        $result = $db->sql_query($sql);
691 3961 psotfx
692 7679 davidmj
        while ($row = $db->sql_fetchrow($result))
693 7679 davidmj
        {
694 7679 davidmj
                $forum_ids[] = $row['forum_id'];
695 7679 davidmj
                $moved_topic_ids[] = $row['topic_id'];
696 7679 davidmj
        }
697 7679 davidmj
        $db->sql_freeresult($result);
698 7679 davidmj
699 7679 davidmj
        if (sizeof($moved_topic_ids))
700 7679 davidmj
        {
701 8146 acydburn
                $sql = 'DELETE FROM ' . TOPICS_TABLE . '
702 7679 davidmj
                        WHERE ' . $db->sql_in_set('topic_id', $moved_topic_ids);
703 7679 davidmj
                $db->sql_query($sql);
704 7679 davidmj
        }
705 7679 davidmj
706 3737 ludovic_arnaud
        $db->sql_transaction('commit');
707 3737 ludovic_arnaud
708 3737 ludovic_arnaud
        if ($auto_sync)
709 3737 ludovic_arnaud
        {
710 7679 davidmj
                sync('forum', 'forum_id', array_unique($forum_ids), true, true);
711 3936 ludovic_arnaud
                sync('topic_reported', $where_type, $where_ids);
712 3737 ludovic_arnaud
        }
713 3737 ludovic_arnaud
714 6584 acydburn
        if ($approved_topics)
715 6584 acydburn
        {
716 9398 acydburn
                set_config_count('num_topics', $approved_topics * (-1), true);
717 6584 acydburn
        }
718 6149 acydburn
719 3737 ludovic_arnaud
        return $return;
720 3737 ludovic_arnaud
}
721 3737 ludovic_arnaud
722 5114 acydburn
/**
723 5114 acydburn
* Remove post(s)
724 5114 acydburn
*/
725 7221 acydburn
function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = true, $post_count_sync = true, $call_delete_topics = true)
726 3737 ludovic_arnaud
{
727 5441 naderman
        global $db, $config, $phpbb_root_path, $phpEx;
728 3737 ludovic_arnaud
729 7000 davidmj
        if ($where_type === 'range')
730 3737 ludovic_arnaud
        {
731 7000 davidmj
                $where_clause = $where_ids;
732 3737 ludovic_arnaud
        }
733 6271 acydburn
        else
734 6271 acydburn
        {
735 7000 davidmj
                if (is_array($where_ids))
736 7000 davidmj
                {
737 7000 davidmj
                        $where_ids = array_unique($where_ids);
738 7000 davidmj
                }
739 7000 davidmj
                else
740 7000 davidmj
                {
741 7000 davidmj
                        $where_ids = array($where_ids);
742 7000 davidmj
                }
743 6015 acydburn
744 7000 davidmj
                if (!sizeof($where_ids))
745 7000 davidmj
                {
746 7000 davidmj
                        return false;
747 7000 davidmj
                }
748 7000 davidmj
749 9439 acydburn
                $where_ids = array_map('intval', $where_ids);
750 9439 acydburn
751 9439 acydburn
/*                Possible code for splitting post deletion
752 9439 acydburn
                if (sizeof($where_ids) >= 1001)
753 9439 acydburn
                {
754 9439 acydburn
                        // Split into chunks of 1000
755 9439 acydburn
                        $chunks = array_chunk($where_ids, 1000);
756 9439 acydburn
757 9439 acydburn
                        foreach ($chunks as $_where_ids)
758 9439 acydburn
                        {
759 9439 acydburn
                                delete_posts($where_type, $_where_ids, $auto_sync, $posted_sync, $post_count_sync, $call_delete_topics);
760 9439 acydburn
                        }
761 9441 acydburn
762 9441 acydburn
                        return;
763 9439 acydburn
                }*/
764 9439 acydburn
765 9439 acydburn
                $where_clause = $db->sql_in_set($where_type, $where_ids);
766 3737 ludovic_arnaud
        }
767 6015 acydburn
768 6584 acydburn
        $approved_posts = 0;
769 6970 acydburn
        $post_ids = $topic_ids = $forum_ids = $post_counts = $remove_topics = array();
770 3737 ludovic_arnaud
771 6584 acydburn
        $sql = 'SELECT post_id, poster_id, post_approved, post_postcount, topic_id, forum_id
772 6271 acydburn
                FROM ' . POSTS_TABLE . '
773 7001 davidmj
                WHERE ' . $where_clause;
774 3737 ludovic_arnaud
        $result = $db->sql_query($sql);
775 4813 psotfx
776 3737 ludovic_arnaud
        while ($row = $db->sql_fetchrow($result))
777 3737 ludovic_arnaud
        {
778 9439 acydburn
                $post_ids[] = (int) $row['post_id'];
779 9439 acydburn
                $poster_ids[] = (int) $row['poster_id'];
780 9439 acydburn
                $topic_ids[] = (int) $row['topic_id'];
781 9439 acydburn
                $forum_ids[] = (int) $row['forum_id'];
782 6224 acydburn
783 8805 acydburn
                if ($row['post_postcount'] && $post_count_sync && $row['post_approved'])
784 6224 acydburn
                {
785 6224 acydburn
                        $post_counts[$row['poster_id']] = (!empty($post_counts[$row['poster_id']])) ? $post_counts[$row['poster_id']] + 1 : 1;
786 6224 acydburn
                }
787 6584 acydburn
788 6584 acydburn
                if ($row['post_approved'])
789 6584 acydburn
                {
790 6584 acydburn
                        $approved_posts++;
791 6584 acydburn
                }
792 3737 ludovic_arnaud
        }
793 6015 acydburn
        $db->sql_freeresult($result);
794 3737 ludovic_arnaud
795 5033 acydburn
        if (!sizeof($post_ids))
796 3737 ludovic_arnaud
        {
797 3883 acydburn
                return false;
798 3737 ludovic_arnaud
        }
799 3737 ludovic_arnaud
800 3737 ludovic_arnaud
        $db->sql_transaction('begin');
801 3961 psotfx
802 5441 naderman
        $table_ary = array(POSTS_TABLE, REPORTS_TABLE);
803 4813 psotfx
804 3961 psotfx
        foreach ($table_ary as $table)
805 3961 psotfx
        {
806 8146 acydburn
                $sql = "DELETE FROM $table
807 6271 acydburn
                        WHERE " . $db->sql_in_set('post_id', $post_ids);
808 3961 psotfx
                $db->sql_query($sql);
809 3961 psotfx
        }
810 3961 psotfx
        unset($table_ary);
811 3961 psotfx
812 6224 acydburn
        // Adjust users post counts
813 6974 naderman
        if (sizeof($post_counts) && $post_count_sync)
814 6224 acydburn
        {
815 6224 acydburn
                foreach ($post_counts as $poster_id => $substract)
816 6224 acydburn
                {
817 6224 acydburn
                        $sql = 'UPDATE ' . USERS_TABLE . '
818 7677 kellanved
                                SET user_posts = 0
819 8146 acydburn
                                WHERE user_id = ' . $poster_id . '
820 7677 kellanved
                                AND user_posts < ' . $substract;
821 7677 kellanved
                        $db->sql_query($sql);
822 8805 acydburn
823 7677 kellanved
                        $sql = 'UPDATE ' . USERS_TABLE . '
824 6224 acydburn
                                SET user_posts = user_posts - ' . $substract . '
825 8146 acydburn
                                WHERE user_id = ' . $poster_id . '
826 7677 kellanved
                                AND user_posts >= ' . $substract;
827 6224 acydburn
                        $db->sql_query($sql);
828 6224 acydburn
                }
829 6224 acydburn
        }
830 6224 acydburn
831 6970 acydburn
        // Remove topics now having no posts?
832 6970 acydburn
        if (sizeof($topic_ids))
833 6970 acydburn
        {
834 6970 acydburn
                $sql = 'SELECT topic_id
835 6970 acydburn
                        FROM ' . POSTS_TABLE . '
836 6970 acydburn
                        WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
837 6970 acydburn
                        GROUP BY topic_id';
838 6970 acydburn
                $result = $db->sql_query($sql);
839 6970 acydburn
840 6970 acydburn
                while ($row = $db->sql_fetchrow($result))
841 6970 acydburn
                {
842 6970 acydburn
                        $remove_topics[] = $row['topic_id'];
843 6970 acydburn
                }
844 6970 acydburn
                $db->sql_freeresult($result);
845 6970 acydburn
846 6970 acydburn
                // Actually, those not within remove_topics should be removed. ;)
847 6970 acydburn
                $remove_topics = array_diff($topic_ids, $remove_topics);
848 6970 acydburn
        }
849 6970 acydburn
850 5441 naderman
        // Remove the message from the search index
851 6015 acydburn
        $search_type = basename($config['search_type']);
852 5441 naderman
853 5441 naderman
        if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
854 5441 naderman
        {
855 5441 naderman
                trigger_error('NO_SUCH_SEARCH_MODULE');
856 5441 naderman
        }
857 5441 naderman
858 6345 acydburn
        include_once("{$phpbb_root_path}includes/search/$search_type.$phpEx");
859 5441 naderman
860 5441 naderman
        $error = false;
861 5441 naderman
        $search = new $search_type($error);
862 5441 naderman
863 5441 naderman
        if ($error)
864 5441 naderman
        {
865 5441 naderman
                trigger_error($error);
866 5441 naderman
        }
867 5441 naderman
868 6152 naderman
        $search->index_remove($post_ids, $poster_ids, $forum_ids);
869 5441 naderman
870 4920 acydburn
        delete_attachments('post', $post_ids, false);
871 4482 acydburn
872 3737 ludovic_arnaud
        $db->sql_transaction('commit');
873 3737 ludovic_arnaud
874 5973 acydburn
        // Resync topics_posted table
875 5973 acydburn
        if ($posted_sync)
876 5973 acydburn
        {
877 5973 acydburn
                update_posted_info($topic_ids);
878 5973 acydburn
        }
879 5973 acydburn
880 3737 ludovic_arnaud
        if ($auto_sync)
881 3737 ludovic_arnaud
        {
882 5622 acydburn
                sync('topic_reported', 'topic_id', $topic_ids);
883 4920 acydburn
                sync('topic', 'topic_id', $topic_ids, true);
884 7466 davidmj
                sync('forum', 'forum_id', $forum_ids, true, true);
885 3737 ludovic_arnaud
        }
886 3737 ludovic_arnaud
887 6584 acydburn
        if ($approved_posts)
888 6584 acydburn
        {
889 9398 acydburn
                set_config_count('num_posts', $approved_posts * (-1), true);
890 6584 acydburn
        }
891 6149 acydburn
892 6970 acydburn
        // We actually remove topics now to not be inconsistent (the delete_topics function calls this function too)
893 7221 acydburn
        if (sizeof($remove_topics) && $call_delete_topics)
894 6970 acydburn
        {
895 7221 acydburn
                delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false);
896 6970 acydburn
        }
897 6970 acydburn
898 4920 acydburn
        return sizeof($post_ids);
899 3737 ludovic_arnaud
}
900 3737 ludovic_arnaud
901 5114 acydburn
/**
902 5114 acydburn
* Delete Attachments
903 6015 acydburn
*
904 8890 acydburn
* @param string $mode can be: post|message|topic|attach|user
905 8890 acydburn
* @param mixed $ids can be: post_ids, message_ids, topic_ids, attach_ids, user_ids
906 6015 acydburn
* @param bool $resync set this to false if you are deleting posts or topics
907 5114 acydburn
*/
908 5313 acydburn
function delete_attachments($mode, $ids, $resync = true)
909 4482 acydburn
{
910 4668 acydburn
        global $db, $config;
911 4482 acydburn
912 10526 bantu
        // 0 is as bad as an empty array
913 10526 bantu
        if (empty($ids))
914 4482 acydburn
        {
915 10526 bantu
                return false;
916 10526 bantu
        }
917 10526 bantu
918 10526 bantu
        if (is_array($ids))
919 10526 bantu
        {
920 4637 acydburn
                $ids = array_unique($ids);
921 6015 acydburn
                $ids = array_map('intval', $ids);
922 4482 acydburn
        }
923 6015 acydburn
        else
924 6015 acydburn
        {
925 6015 acydburn
                $ids = array((int) $ids);
926 6015 acydburn
        }
927 6015 acydburn
928 9379 toonarmy
        $sql_where = '';
929 9379 toonarmy
930 8890 acydburn
        switch ($mode)
931 8890 acydburn
        {
932 8890 acydburn
                case 'post':
933 8890 acydburn
                case 'message':
934 8890 acydburn
                        $sql_id = 'post_msg_id';
935 9379 toonarmy
                        $sql_where = ' AND in_message = ' . ($mode == 'message' ? 1 : 0);
936 8890 acydburn
                break;
937 4482 acydburn
938 8890 acydburn
                case 'topic':
939 8890 acydburn
                        $sql_id = 'topic_id';
940 8890 acydburn
                break;
941 4637 acydburn
942 8890 acydburn
                case 'user':
943 8890 acydburn
                        $sql_id = 'poster_id';
944 8890 acydburn
                break;
945 6015 acydburn
946 8890 acydburn
                case 'attach':
947 8890 acydburn
                default:
948 8890 acydburn
                        $sql_id = 'attach_id';
949 8890 acydburn
                        $mode = 'attach';
950 8890 acydburn
                break;
951 4637 acydburn
        }
952 4482 acydburn
953 8890 acydburn
        $post_ids = $message_ids = $topic_ids = $physical = array();
954 8890 acydburn
955 8890 acydburn
        // Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)
956 8890 acydburn
        $sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan
957 4637 acydburn
                        FROM ' . ATTACHMENTS_TABLE . '
958 8890 acydburn
                        WHERE ' . $db->sql_in_set($sql_id, $ids);
959 9379 toonarmy
960 9379 toonarmy
        $sql .= $sql_where;
961 9379 toonarmy
962 8890 acydburn
        $result = $db->sql_query($sql);
963 6015 acydburn
964 8890 acydburn
        while ($row = $db->sql_fetchrow($result))
965 8890 acydburn
        {
966 8890 acydburn
                // We only need to store post/message/topic ids if resync is enabled and the file is not orphaned
967 8890 acydburn
                if ($resync && !$row['is_orphan'])
968 4482 acydburn
                {
969 8890 acydburn
                        if (!$row['in_message'])
970 8890 acydburn
                        {
971 8890 acydburn
                                $post_ids[] = $row['post_msg_id'];
972 8890 acydburn
                                $topic_ids[] = $row['topic_id'];
973 8890 acydburn
                        }
974 8890 acydburn
                        else
975 8890 acydburn
                        {
976 8890 acydburn
                                $message_ids[] = $row['post_msg_id'];
977 8890 acydburn
                        }
978 4482 acydburn
                }
979 8890 acydburn
980 8890 acydburn
                $physical[] = array('filename' => $row['physical_filename'], 'thumbnail' => $row['thumbnail'], 'filesize' => $row['filesize'], 'is_orphan' => $row['is_orphan']);
981 4482 acydburn
        }
982 8890 acydburn
        $db->sql_freeresult($result);
983 4637 acydburn
984 4637 acydburn
        // Delete attachments
985 6015 acydburn
        $sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '
986 6271 acydburn
                WHERE ' . $db->sql_in_set($sql_id, $ids);
987 9379 toonarmy
988 9379 toonarmy
        $sql .= $sql_where;
989 9379 toonarmy
990 6015 acydburn
        $db->sql_query($sql);
991 4637 acydburn
        $num_deleted = $db->sql_affectedrows();
992 4637 acydburn
993 4677 acydburn
        if (!$num_deleted)
994 4677 acydburn
        {
995 4677 acydburn
                return 0;
996 4677 acydburn
        }
997 6015 acydburn
998 4637 acydburn
        // Delete attachments from filesystem
999 4668 acydburn
        $space_removed = $files_removed = 0;
1000 4637 acydburn
        foreach ($physical as $file_ary)
1001 4482 acydburn
        {
1002 8890 acydburn
                if (phpbb_unlink($file_ary['filename'], 'file', true) && !$file_ary['is_orphan'])
1003 4668 acydburn
                {
1004 8890 acydburn
                        // Only non-orphaned files count to the file size
1005 4668 acydburn
                        $space_removed += $file_ary['filesize'];
1006 4668 acydburn
                        $files_removed++;
1007 4668 acydburn
                }
1008 4668 acydburn
1009 4637 acydburn
                if ($file_ary['thumbnail'])
1010 4482 acydburn
                {
1011 6831 acydburn
                        phpbb_unlink($file_ary['filename'], 'thumbnail', true);
1012 4482 acydburn
                }
1013 4637 acydburn
        }
1014 4482 acydburn
1015 8890 acydburn
        if ($space_removed || $files_removed)
1016 4637 acydburn
        {
1017 9398 acydburn
                set_config_count('upload_dir_size', $space_removed * (-1), true);
1018 9398 acydburn
                set_config_count('num_files', $files_removed * (-1), true);
1019 4482 acydburn
        }
1020 4637 acydburn
1021 8890 acydburn
        // If we do not resync, we do not need to adjust any message, post, topic or user entries
1022 8890 acydburn
        if (!$resync)
1023 4482 acydburn
        {
1024 8890 acydburn
                return $num_deleted;
1025 4482 acydburn
        }
1026 8890 acydburn
1027 8890 acydburn
        // No more use for the original ids
1028 4637 acydburn
        unset($ids);
1029 4482 acydburn
1030 8890 acydburn
        // Now, we need to resync posts, messages, topics. We go through every one of them
1031 4637 acydburn
        $post_ids = array_unique($post_ids);
1032 8890 acydburn
        $message_ids = array_unique($message_ids);
1033 4637 acydburn
        $topic_ids = array_unique($topic_ids);
1034 4637 acydburn
1035 8890 acydburn
        // Update post indicators for posts now no longer having attachments
1036 4663 acydburn
        if (sizeof($post_ids))
1037 4482 acydburn
        {
1038 9843 nickvergessen
                // Just check which posts are still having an assigned attachment not orphaned by querying the attachments table
1039 9843 nickvergessen
                $sql = 'SELECT post_msg_id
1040 9843 nickvergessen
                        FROM ' . ATTACHMENTS_TABLE . '
1041 9843 nickvergessen
                        WHERE ' . $db->sql_in_set('post_msg_id', $post_ids) . '
1042 9843 nickvergessen
                                AND in_message = 0
1043 9843 nickvergessen
                                AND is_orphan = 0';
1044 9843 nickvergessen
                $result = $db->sql_query($sql);
1045 9843 nickvergessen
1046 9843 nickvergessen
                $remaining_ids = array();
1047 9843 nickvergessen
                while ($row = $db->sql_fetchrow($result))
1048 9843 nickvergessen
                {
1049 9843 nickvergessen
                        $remaining_ids[] = $row['post_msg_id'];
1050 9843 nickvergessen
                }
1051 9843 nickvergessen
                $db->sql_freeresult($result);
1052 9843 nickvergessen
1053 9843 nickvergessen
                // Now only unset those ids remaining
1054 9843 nickvergessen
                $post_ids = array_diff($post_ids, $remaining_ids);
1055 9843 nickvergessen
1056 9843 nickvergessen
                if (sizeof($post_ids))
1057 9843 nickvergessen
                {
1058 9843 nickvergessen
                        $sql = 'UPDATE ' . POSTS_TABLE . '
1059 9843 nickvergessen
                                SET post_attachment = 0
1060 9843 nickvergessen
                                WHERE ' . $db->sql_in_set('post_id', $post_ids);
1061 9843 nickvergessen
                        $db->sql_query($sql);
1062 9843 nickvergessen
                }
1063 8890 acydburn
        }
1064 4482 acydburn
1065 8890 acydburn
        // Update message table if messages are affected
1066 8890 acydburn
        if (sizeof($message_ids))
1067 8890 acydburn
        {
1068 9843 nickvergessen
                // Just check which messages are still having an assigned attachment not orphaned by querying the attachments table
1069 9843 nickvergessen
                $sql = 'SELECT post_msg_id
1070 9843 nickvergessen
                        FROM ' . ATTACHMENTS_TABLE . '
1071 9843 nickvergessen
                        WHERE ' . $db->sql_in_set('post_msg_id', $message_ids) . '
1072 9843 nickvergessen
                                AND in_message = 1
1073 9843 nickvergessen
                                AND is_orphan = 0';
1074 9843 nickvergessen
                $result = $db->sql_query($sql);
1075 9843 nickvergessen
1076 9843 nickvergessen
                $remaining_ids = array();
1077 9843 nickvergessen
                while ($row = $db->sql_fetchrow($result))
1078 9843 nickvergessen
                {
1079 9843 nickvergessen
                        $remaining_ids[] = $row['post_msg_id'];
1080 9843 nickvergessen
                }
1081 9843 nickvergessen
                $db->sql_freeresult($result);
1082 9843 nickvergessen
1083 9843 nickvergessen
                // Now only unset those ids remaining
1084 9843 nickvergessen
                $message_ids = array_diff($message_ids, $remaining_ids);
1085 9843 nickvergessen
1086 9843 nickvergessen
                if (sizeof($message_ids))
1087 9843 nickvergessen
                {
1088 9843 nickvergessen
                        $sql = 'UPDATE ' . PRIVMSGS_TABLE . '
1089 9843 nickvergessen
                                SET message_attachment = 0
1090 9843 nickvergessen
                                WHERE ' . $db->sql_in_set('msg_id', $message_ids);
1091 9843 nickvergessen
                        $db->sql_query($sql);
1092 9843 nickvergessen
                }
1093 4482 acydburn
        }
1094 4482 acydburn
1095 8890 acydburn
        // Now update the topics. This is a bit trickier, because there could be posts still having attachments within the topic
1096 4663 acydburn
        if (sizeof($topic_ids))
1097 4482 acydburn
        {
1098 8890 acydburn
                // Just check which topics are still having an assigned attachment not orphaned by querying the attachments table (much less entries expected)
1099 8890 acydburn
                $sql = 'SELECT topic_id
1100 8890 acydburn
                        FROM ' . ATTACHMENTS_TABLE . '
1101 8890 acydburn
                        WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
1102 8890 acydburn
                                AND is_orphan = 0';
1103 8890 acydburn
                $result = $db->sql_query($sql);
1104 8890 acydburn
1105 8890 acydburn
                $remaining_ids = array();
1106 8890 acydburn
                while ($row = $db->sql_fetchrow($result))
1107 4663 acydburn
                {
1108 8890 acydburn
                        $remaining_ids[] = $row['topic_id'];
1109 8890 acydburn
                }
1110 8890 acydburn
                $db->sql_freeresult($result);
1111 8890 acydburn
1112 8890 acydburn
                // Now only unset those ids remaining
1113 8890 acydburn
                $topic_ids = array_diff($topic_ids, $remaining_ids);
1114 8890 acydburn
1115 8890 acydburn
                if (sizeof($topic_ids))
1116 8890 acydburn
                {
1117 6015 acydburn
                        $sql = 'UPDATE ' . TOPICS_TABLE . '
1118 4663 acydburn
                                SET topic_attachment = 0
1119 6271 acydburn
                                WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
1120 6015 acydburn
                        $db->sql_query($sql);
1121 4663 acydburn
                }
1122 4482 acydburn
        }
1123 4663 acydburn
1124 4637 acydburn
        return $num_deleted;
1125 4482 acydburn
}
1126 4482 acydburn
1127 5114 acydburn
/**
1128 10734 git-gate
* Deletes shadow topics pointing to a specified forum.
1129 10734 git-gate
*
1130 10734 git-gate
* @param int                $forum_id                The forum id
1131 10734 git-gate
* @param string                $sql_more                Additional WHERE statement, e.g. t.topic_time < (time() - 1234)
1132 10734 git-gate
* @param bool                $auto_sync                Will call sync() if this is true
1133 10734 git-gate
*
1134 10734 git-gate
* @return array                Array with affected forums
1135 10734 git-gate
*
1136 10734 git-gate
* @author bantu
1137 5114 acydburn
*/
1138 10734 git-gate
function delete_topic_shadows($forum_id, $sql_more = '', $auto_sync = true)
1139 4534 ludovic_arnaud
{
1140 10734 git-gate
        global $db;
1141 4534 ludovic_arnaud
1142 10734 git-gate
        if (!$forum_id)
1143 4534 ludovic_arnaud
        {
1144 10734 git-gate
                // Nothing to do.
1145 10734 git-gate
                return;
1146 10734 git-gate
        }
1147 8782 acydburn
1148 10734 git-gate
        // Set of affected forums we have to resync
1149 10734 git-gate
        $sync_forum_ids = array();
1150 6015 acydburn
1151 10734 git-gate
        // Amount of topics we select and delete at once.
1152 10734 git-gate
        $batch_size = 500;
1153 4534 ludovic_arnaud
1154 10734 git-gate
        do
1155 10734 git-gate
        {
1156 10734 git-gate
                $sql = 'SELECT t2.forum_id, t2.topic_id
1157 10734 git-gate
                        FROM ' . TOPICS_TABLE . ' t2, ' . TOPICS_TABLE . ' t
1158 10734 git-gate
                        WHERE t2.topic_moved_id = t.topic_id
1159 10734 git-gate
                                AND t.forum_id = ' . (int) $forum_id . '
1160 10734 git-gate
                                ' . (($sql_more) ? 'AND ' . $sql_more : '');
1161 10734 git-gate
                $result = $db->sql_query_limit($sql, $batch_size);
1162 10734 git-gate
1163 10734 git-gate
                $topic_ids = array();
1164 10734 git-gate
                while ($row = $db->sql_fetchrow($result))
1165 10734 git-gate
                {
1166 10734 git-gate
                        $topic_ids[] = (int) $row['topic_id'];
1167 10734 git-gate
1168 10734 git-gate
                        $sync_forum_ids[(int) $row['forum_id']] = (int) $row['forum_id'];
1169 10734 git-gate
                }
1170 10734 git-gate
                $db->sql_freeresult($result);
1171 10734 git-gate
1172 10734 git-gate
                if (!empty($topic_ids))
1173 10734 git-gate
                {
1174 10734 git-gate
                        $sql = 'DELETE FROM ' . TOPICS_TABLE . '
1175 10734 git-gate
                                WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
1176 10734 git-gate
                        $db->sql_query($sql);
1177 10734 git-gate
                }
1178 4534 ludovic_arnaud
        }
1179 10734 git-gate
        while (sizeof($topic_ids) == $batch_size);
1180 4534 ludovic_arnaud
1181 4534 ludovic_arnaud
        if ($auto_sync)
1182 4534 ludovic_arnaud
        {
1183 10734 git-gate
                sync('forum', 'forum_id', $sync_forum_ids, true, true);
1184 4534 ludovic_arnaud
        }
1185 10734 git-gate
1186 10734 git-gate
        return $sync_forum_ids;
1187 4534 ludovic_arnaud
}
1188 4534 ludovic_arnaud
1189 5114 acydburn
/**
1190 6650 acydburn
* Update/Sync posted information for topics
1191 5933 acydburn
*/
1192 5973 acydburn
function update_posted_info(&$topic_ids)
1193 5933 acydburn
{
1194 5973 acydburn
        global $db, $config;
1195 5933 acydburn
1196 5973 acydburn
        if (empty($topic_ids) || !$config['load_db_track'])
1197 5933 acydburn
        {
1198 5933 acydburn
                return;
1199 5933 acydburn
        }
1200 5933 acydburn
1201 5933 acydburn
        // First of all, let us remove any posted information for these topics
1202 5933 acydburn
        $sql = 'DELETE FROM ' . TOPICS_POSTED_TABLE . '
1203 6271 acydburn
                WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
1204 5933 acydburn
        $db->sql_query($sql);
1205 5933 acydburn
1206 5933 acydburn
        // Now, let us collect the user/topic combos for rebuilding the information
1207 5973 acydburn
        $sql = 'SELECT poster_id, topic_id
1208 5933 acydburn
                FROM ' . POSTS_TABLE . '
1209 6271 acydburn
                WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
1210 5973 acydburn
                        AND poster_id <> ' . ANONYMOUS . '
1211 5973 acydburn
                GROUP BY poster_id, topic_id';
1212 5933 acydburn
        $result = $db->sql_query($sql);
1213 5933 acydburn
1214 5933 acydburn
        $posted = array();
1215 5933 acydburn
        while ($row = $db->sql_fetchrow($result))
1216 5933 acydburn
        {
1217 5933 acydburn
                // Add as key to make them unique (grouping by) and circumvent empty keys on array_unique
1218 5973 acydburn
                $posted[$row['poster_id']][] = $row['topic_id'];
1219 5933 acydburn
        }
1220 5933 acydburn
        $db->sql_freeresult($result);
1221 5933 acydburn
1222 5933 acydburn
        // Now add the information...
1223 5933 acydburn
        $sql_ary = array();
1224 5973 acydburn
        foreach ($posted as $user_id => $topic_row)
1225 5933 acydburn
        {
1226 5973 acydburn
                foreach ($topic_row as $topic_id)
1227 5933 acydburn
                {
1228 5933 acydburn
                        $sql_ary[] = array(
1229 7961 acydburn
                                'user_id'                => (int) $user_id,
1230 7961 acydburn
                                'topic_id'                => (int) $topic_id,
1231 5933 acydburn
                                'topic_posted'        => 1,
1232 5933 acydburn
                        );
1233 5933 acydburn
                }
1234 5933 acydburn
        }
1235 5973 acydburn
        unset($posted);
1236 5933 acydburn
1237 6497 acydburn
        $db->sql_multi_insert(TOPICS_POSTED_TABLE, $sql_ary);
1238 5933 acydburn
}
1239 5933 acydburn
1240 5933 acydburn
/**
1241 6831 acydburn
* Delete attached file
1242 5114 acydburn
*/
1243 6831 acydburn
function phpbb_unlink($filename, $mode = 'file', $entry_removed = false)
1244 4572 acydburn
{
1245 6831 acydburn
        global $db, $phpbb_root_path, $config;
1246 4572 acydburn
1247 6831 acydburn
        // Because of copying topics or modifications a physical filename could be assigned more than once. If so, do not remove the file itself.
1248 6831 acydburn
        $sql = 'SELECT COUNT(attach_id) AS num_entries
1249 6831 acydburn
                FROM ' . ATTACHMENTS_TABLE . "
1250 9905 acydburn
                WHERE physical_filename = '" . $db->sql_escape(utf8_basename($filename)) . "'";
1251 6831 acydburn
        $result = $db->sql_query($sql);
1252 6831 acydburn
        $num_entries = (int) $db->sql_fetchfield('num_entries');
1253 6831 acydburn
        $db->sql_freeresult($result);
1254 6831 acydburn
1255 6831 acydburn
        // Do not remove file if at least one additional entry with the same name exist.
1256 6831 acydburn
        if (($entry_removed && $num_entries > 0) || (!$entry_removed && $num_entries > 1))
1257 6831 acydburn
        {
1258 6831 acydburn
                return false;
1259 6831 acydburn
        }
1260 6831 acydburn
1261 9905 acydburn
        $filename = ($mode == 'thumbnail') ? 'thumb_' . utf8_basename($filename) : utf8_basename($filename);
1262 6831 acydburn
        return @unlink($phpbb_root_path . $config['upload_path'] . '/' . $filename);
1263 4572 acydburn
}
1264 4572 acydburn
1265 5114 acydburn
/**
1266 5114 acydburn
* All-encompasing sync function
1267 5114 acydburn
*
1268 6015 acydburn
* Exaples:
1269 6015 acydburn
* <code>
1270 6015 acydburn
* sync('topic', 'topic_id', 123);                        // resync topic #123
1271 6015 acydburn
* sync('topic', 'forum_id', array(2, 3));        // resync topics from forum #2 and #3
1272 6015 acydburn
* sync('topic');                                                        // resync all topics
1273 6015 acydburn
* sync('topic', 'range', 'topic_id BETWEEN 1 AND 60');        // resync a range of topics/forums (only available for 'topic' and 'forum' modes)
1274 6015 acydburn
* </code>
1275 5114 acydburn
*
1276 5114 acydburn
* Modes:
1277 6015 acydburn
* - forum                                Resync complete forum
1278 6015 acydburn
* - topic                                Resync topics
1279 6015 acydburn
* - topic_moved                        Removes topic shadows that would be in the same forum as the topic they link to
1280 5114 acydburn
* - topic_approved                Resyncs the topic_approved flag according to the status of the first post
1281 5114 acydburn
* - post_reported                Resyncs the post_reported flag, relying on actual reports
1282 5114 acydburn
* - topic_reported                Resyncs the topic_reported flag, relying on post_reported flags
1283 6015 acydburn
* - post_attachement        Same as post_reported, but with attachment flags
1284 6015 acydburn
* - topic_attachement        Same as topic_reported, but with attachment flags
1285 5114 acydburn
*/
1286 5313 acydburn
function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $sync_extra = false)
1287 3737 ludovic_arnaud
{
1288 3961 psotfx
        global $db;
1289 3737 ludovic_arnaud
1290 3737 ludovic_arnaud
        if (is_array($where_ids))
1291 3737 ludovic_arnaud
        {
1292 3737 ludovic_arnaud
                $where_ids = array_unique($where_ids);
1293 6015 acydburn
                $where_ids = array_map('intval', $where_ids);
1294 3737 ludovic_arnaud
        }
1295 5313 acydburn
        else if ($where_type != 'range')
1296 3737 ludovic_arnaud
        {
1297 6015 acydburn
                $where_ids = ($where_ids) ? array((int) $where_ids) : array();
1298 3737 ludovic_arnaud
        }
1299 3737 ludovic_arnaud
1300 7504 davidmj
        if ($mode == 'forum' || $mode == 'topic' || $mode == 'topic_approved' || $mode == 'topic_reported' || $mode == 'post_reported')
1301 3737 ludovic_arnaud
        {
1302 3737 ludovic_arnaud
                if (!$where_type)
1303 3737 ludovic_arnaud
                {
1304 5033 acydburn
                        $where_sql = '';
1305 5033 acydburn
                        $where_sql_and = 'WHERE';
1306 3737 ludovic_arnaud
                }
1307 5313 acydburn
                else if ($where_type == 'range')
1308 4507 ludovic_arnaud
                {
1309 5026 bartvb
                        // Only check a range of topics/forums. For instance: 'topic_id BETWEEN 1 AND 60'
1310 6459 acydburn
                        $where_sql = 'WHERE (' . $mode[0] . ".$where_ids)";
1311 4671 ludovic_arnaud
                        $where_sql_and = $where_sql . "\n\tAND";
1312 4507 ludovic_arnaud
                }
1313 3737 ludovic_arnaud
                else
1314 3737 ludovic_arnaud
                {
1315 5779 naderman
                        // Do not sync the "global forum"
1316 5779 naderman
                        $where_ids = array_diff($where_ids, array(0));
1317 5779 naderman
1318 4903 acydburn
                        if (!sizeof($where_ids))
1319 4903 acydburn
                        {
1320 5026 bartvb
                                // Empty array with IDs. This means that we don't have any work to do. Just return.
1321 4903 acydburn
                                return;
1322 4903 acydburn
                        }
1323 5779 naderman
1324 5026 bartvb
                        // Limit the topics/forums we are syncing, use specific topic/forum IDs.
1325 5033 acydburn
                        // $where_type contains the field for the where clause (forum_id, topic_id)
1326 6459 acydburn
                        $where_sql = 'WHERE ' . $db->sql_in_set($mode[0] . '.' . $where_type, $where_ids);
1327 4671 ludovic_arnaud
                        $where_sql_and = $where_sql . "\n\tAND";
1328 3737 ludovic_arnaud
                }
1329 3737 ludovic_arnaud
        }
1330 3936 ludovic_arnaud
        else
1331 3936 ludovic_arnaud
        {
1332 6420 acydburn
                if (!sizeof($where_ids))
1333 4903 acydburn
                {
1334 6420 acydburn
                        return;
1335 4903 acydburn
                }
1336 6015 acydburn
1337 6420 acydburn
                // $where_type contains the field for the where clause (forum_id, topic_id)
1338 6459 acydburn
                $where_sql = 'WHERE ' . $db->sql_in_set($mode[0] . '.' . $where_type, $where_ids);
1339 6420 acydburn
                $where_sql_and = $where_sql . "\n\tAND";
1340 3936 ludovic_arnaud
        }
1341 3737 ludovic_arnaud
1342 3737 ludovic_arnaud
        switch ($mode)
1343 3737 ludovic_arnaud
        {
1344 4507 ludovic_arnaud
                case 'topic_moved':
1345 9937 Kellanved
                        $db->sql_transaction('begin');
1346 6497 acydburn
                        switch ($db->sql_layer)
1347 4507 ludovic_arnaud
                        {
1348 4507 ludovic_arnaud
                                case 'mysql4':
1349 5135 acydburn
                                case 'mysqli':
1350 4507 ludovic_arnaud
                                        $sql = 'DELETE FROM ' . TOPICS_TABLE . '
1351 4507 ludovic_arnaud
                                                USING ' . TOPICS_TABLE . ' t1, ' . TOPICS_TABLE . " t2
1352 4507 ludovic_arnaud
                                                WHERE t1.topic_moved_id = t2.topic_id
1353 4507 ludovic_arnaud
                                                        AND t1.forum_id = t2.forum_id";
1354 4507 ludovic_arnaud
                                        $db->sql_query($sql);
1355 4507 ludovic_arnaud
                                break;
1356 8782 acydburn
1357 4507 ludovic_arnaud
                                default:
1358 4507 ludovic_arnaud
                                        $sql = 'SELECT t1.topic_id
1359 4507 ludovic_arnaud
                                                FROM ' .TOPICS_TABLE . ' t1, ' . TOPICS_TABLE . " t2
1360 4507 ludovic_arnaud
                                                WHERE t1.topic_moved_id = t2.topic_id
1361 4507 ludovic_arnaud
                                                        AND t1.forum_id = t2.forum_id";
1362 4903 acydburn
                                        $result = $db->sql_query($sql);
1363 4507 ludovic_arnaud
1364 6015 acydburn
                                        $topic_id_ary = array();
1365 6015 acydburn
                                        while ($row = $db->sql_fetchrow($result))
1366 4507 ludovic_arnaud
                                        {
1367 6015 acydburn
                                                $topic_id_ary[] = $row['topic_id'];
1368 6015 acydburn
                                        }
1369 6015 acydburn
                                        $db->sql_freeresult($result);
1370 4507 ludovic_arnaud
1371 6015 acydburn
                                        if (!sizeof($topic_id_ary))
1372 6015 acydburn
                                        {
1373 6015 acydburn
                                                return;
1374 4507 ludovic_arnaud
                                        }
1375 6015 acydburn
1376 6015 acydburn
                                        $sql = 'DELETE FROM ' . TOPICS_TABLE . '
1377 6271 acydburn
                                                WHERE ' . $db->sql_in_set('topic_id', $topic_id_ary);
1378 6015 acydburn
                                        $db->sql_query($sql);
1379 9965 acydburn
1380 6015 acydburn
                                break;
1381 4507 ludovic_arnaud
                        }
1382 9965 acydburn
1383 9937 Kellanved
                        $db->sql_transaction('commit');
1384 9937 Kellanved
                        break;
1385 4507 ludovic_arnaud
1386 3936 ludovic_arnaud
                case 'topic_approved':
1387 9965 acydburn
1388 9937 Kellanved
                        $db->sql_transaction('begin');
1389 6497 acydburn
                        switch ($db->sql_layer)
1390 2286 psotfx
                        {
1391 4671 ludovic_arnaud
                                case 'mysql4':
1392 5135 acydburn
                                case 'mysqli':
1393 4671 ludovic_arnaud
                                        $sql = 'UPDATE ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
1394 4671 ludovic_arnaud
                                                SET t.topic_approved = p.post_approved
1395 4671 ludovic_arnaud
                                                $where_sql_and t.topic_first_post_id = p.post_id";
1396 4671 ludovic_arnaud
                                        $db->sql_query($sql);
1397 4671 ludovic_arnaud
                                break;
1398 6419 acydburn
1399 4671 ludovic_arnaud
                                default:
1400 4671 ludovic_arnaud
                                        $sql = 'SELECT t.topic_id, p.post_approved
1401 4671 ludovic_arnaud
                                                FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
1402 4671 ludovic_arnaud
                                                $where_sql_and p.post_id = t.topic_first_post_id
1403 4671 ludovic_arnaud
                                                        AND p.post_approved <> t.topic_approved";
1404 4671 ludovic_arnaud
                                        $result = $db->sql_query($sql);
1405 2286 psotfx
1406 4671 ludovic_arnaud
                                        $topic_ids = array();
1407 4671 ludovic_arnaud
                                        while ($row = $db->sql_fetchrow($result))
1408 4671 ludovic_arnaud
                                        {
1409 4671 ludovic_arnaud
                                                $topic_ids[] = $row['topic_id'];
1410 4671 ludovic_arnaud
                                        }
1411 6345 acydburn
                                        $db->sql_freeresult($result);
1412 4671 ludovic_arnaud
1413 5033 acydburn
                                        if (!sizeof($topic_ids))
1414 4671 ludovic_arnaud
                                        {
1415 4671 ludovic_arnaud
                                                return;
1416 4671 ludovic_arnaud
                                        }
1417 4671 ludovic_arnaud
1418 4671 ludovic_arnaud
                                        $sql = 'UPDATE ' . TOPICS_TABLE . '
1419 4671 ludovic_arnaud
                                                SET topic_approved = 1 - topic_approved
1420 6271 acydburn
                                                WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
1421 4671 ludovic_arnaud
                                        $db->sql_query($sql);
1422 6015 acydburn
                                break;
1423 3737 ludovic_arnaud
                        }
1424 9965 acydburn
1425 9937 Kellanved
                        $db->sql_transaction('commit');
1426 9937 Kellanved
                        break;
1427 3760 ludovic_arnaud
1428 4671 ludovic_arnaud
                case 'post_reported':
1429 4671 ludovic_arnaud
                        $post_ids = $post_reported = array();
1430 9965 acydburn
1431 9937 Kellanved
                        $db->sql_transaction('begin');
1432 9965 acydburn
1433 4671 ludovic_arnaud
                        $sql = 'SELECT p.post_id, p.post_reported
1434 4671 ludovic_arnaud
                                FROM ' . POSTS_TABLE . " p
1435 4671 ludovic_arnaud
                                $where_sql
1436 4671 ludovic_arnaud
                                GROUP BY p.post_id, p.post_reported";
1437 4671 ludovic_arnaud
                        $result = $db->sql_query($sql);
1438 6015 acydburn
1439 4671 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1440 3936 ludovic_arnaud
                        {
1441 4671 ludovic_arnaud
                                $post_ids[$row['post_id']] = $row['post_id'];
1442 4671 ludovic_arnaud
                                if ($row['post_reported'])
1443 4671 ludovic_arnaud
                                {
1444 4671 ludovic_arnaud
                                        $post_reported[$row['post_id']] = 1;
1445 4671 ludovic_arnaud
                                }
1446 4671 ludovic_arnaud
                        }
1447 6015 acydburn
                        $db->sql_freeresult($result);
1448 3961 psotfx
1449 4671 ludovic_arnaud
                        $sql = 'SELECT DISTINCT(post_id)
1450 4671 ludovic_arnaud
                                FROM ' . REPORTS_TABLE . '
1451 6271 acydburn
                                WHERE ' . $db->sql_in_set('post_id', $post_ids) . '
1452 6063 naderman
                                        AND report_closed = 0';
1453 3961 psotfx
                        $result = $db->sql_query($sql);
1454 3936 ludovic_arnaud
1455 4671 ludovic_arnaud
                        $post_ids = array();
1456 3961 psotfx
                        while ($row = $db->sql_fetchrow($result))
1457 3961 psotfx
                        {
1458 4671 ludovic_arnaud
                                if (!isset($post_reported[$row['post_id']]))
1459 3961 psotfx
                                {
1460 3961 psotfx
                                        $post_ids[] = $row['post_id'];
1461 3961 psotfx
                                }
1462 4671 ludovic_arnaud
                                else
1463 4671 ludovic_arnaud
                                {
1464 4671 ludovic_arnaud
                                        unset($post_reported[$row['post_id']]);
1465 4671 ludovic_arnaud
                                }
1466 3936 ludovic_arnaud
                        }
1467 6015 acydburn
                        $db->sql_freeresult($result);
1468 3936 ludovic_arnaud
1469 4671 ludovic_arnaud
                        // $post_reported should be empty by now, if it's not it contains
1470 4671 ludovic_arnaud
                        // posts that are falsely flagged as reported
1471 4671 ludovic_arnaud
                        foreach ($post_reported as $post_id => $void)
1472 3936 ludovic_arnaud
                        {
1473 4671 ludovic_arnaud
                                $post_ids[] = $post_id;
1474 3936 ludovic_arnaud
                        }
1475 3936 ludovic_arnaud
1476 5033 acydburn
                        if (sizeof($post_ids))
1477 4671 ludovic_arnaud
                        {
1478 4671 ludovic_arnaud
                                $sql = 'UPDATE ' . POSTS_TABLE . '
1479 4671 ludovic_arnaud
                                        SET post_reported = 1 - post_reported
1480 6271 acydburn
                                        WHERE ' . $db->sql_in_set('post_id', $post_ids);
1481 4671 ludovic_arnaud
                                $db->sql_query($sql);
1482 4671 ludovic_arnaud
                        }
1483 9965 acydburn
1484 9937 Kellanved
                        $db->sql_transaction('commit');
1485 9937 Kellanved
                        break;
1486 3936 ludovic_arnaud
1487 4671 ludovic_arnaud
                case 'topic_reported':
1488 4671 ludovic_arnaud
                        if ($sync_extra)
1489 4671 ludovic_arnaud
                        {
1490 4671 ludovic_arnaud
                                sync('post_reported', $where_type, $where_ids);
1491 4671 ludovic_arnaud
                        }
1492 3936 ludovic_arnaud
1493 4671 ludovic_arnaud
                        $topic_ids = $topic_reported = array();
1494 4671 ludovic_arnaud
1495 9937 Kellanved
                        $db->sql_transaction('begin');
1496 9965 acydburn
1497 4671 ludovic_arnaud
                        $sql = 'SELECT DISTINCT(t.topic_id)
1498 4671 ludovic_arnaud
                                FROM ' . POSTS_TABLE . " t
1499 4671 ludovic_arnaud
                                $where_sql_and t.post_reported = 1";
1500 4671 ludovic_arnaud
                        $result = $db->sql_query($sql);
1501 6015 acydburn
1502 4671 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1503 3936 ludovic_arnaud
                        {
1504 4671 ludovic_arnaud
                                $topic_reported[$row['topic_id']] = 1;
1505 4671 ludovic_arnaud
                        }
1506 6015 acydburn
                        $db->sql_freeresult($result);
1507 3961 psotfx
1508 4671 ludovic_arnaud
                        $sql = 'SELECT t.topic_id, t.topic_reported
1509 4671 ludovic_arnaud
                                FROM ' . TOPICS_TABLE . " t
1510 4671 ludovic_arnaud
                                $where_sql";
1511 3961 psotfx
                        $result = $db->sql_query($sql);
1512 6015 acydburn
1513 3961 psotfx
                        while ($row = $db->sql_fetchrow($result))
1514 3961 psotfx
                        {
1515 4671 ludovic_arnaud
                                if ($row['topic_reported'] ^ isset($topic_reported[$row['topic_id']]))
1516 4671 ludovic_arnaud
                                {
1517 3961 psotfx
                                        $topic_ids[] = $row['topic_id'];
1518 4671 ludovic_arnaud
                                }
1519 3936 ludovic_arnaud
                        }
1520 6015 acydburn
                        $db->sql_freeresult($result);
1521 3936 ludovic_arnaud
1522 5033 acydburn
                        if (sizeof($topic_ids))
1523 3936 ludovic_arnaud
                        {
1524 4671 ludovic_arnaud
                                $sql = 'UPDATE ' . TOPICS_TABLE . '
1525 4671 ludovic_arnaud
                                        SET topic_reported = 1 - topic_reported
1526 6271 acydburn
                                        WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
1527 4671 ludovic_arnaud
                                $db->sql_query($sql);
1528 3936 ludovic_arnaud
                        }
1529 9965 acydburn
1530 9937 Kellanved
                        $db->sql_transaction('commit');
1531 9937 Kellanved
                        break;
1532 3936 ludovic_arnaud
1533 4671 ludovic_arnaud
                case 'post_attachment':
1534 4671 ludovic_arnaud
                        $post_ids = $post_attachment = array();
1535 3760 ludovic_arnaud
1536 9937 Kellanved
                        $db->sql_transaction('begin');
1537 9965 acydburn
1538 4671 ludovic_arnaud
                        $sql = 'SELECT p.post_id, p.post_attachment
1539 4671 ludovic_arnaud
                                FROM ' . POSTS_TABLE . " p
1540 4671 ludovic_arnaud
                                $where_sql
1541 4671 ludovic_arnaud
                                GROUP BY p.post_id, p.post_attachment";
1542 4671 ludovic_arnaud
                        $result = $db->sql_query($sql);
1543 6015 acydburn
1544 4671 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1545 3737 ludovic_arnaud
                        {
1546 4671 ludovic_arnaud
                                $post_ids[$row['post_id']] = $row['post_id'];
1547 4671 ludovic_arnaud
                                if ($row['post_attachment'])
1548 3760 ludovic_arnaud
                                {
1549 4671 ludovic_arnaud
                                        $post_attachment[$row['post_id']] = 1;
1550 3760 ludovic_arnaud
                                }
1551 3737 ludovic_arnaud
                        }
1552 6015 acydburn
                        $db->sql_freeresult($result);
1553 3737 ludovic_arnaud
1554 4915 acydburn
                        $sql = 'SELECT DISTINCT(post_msg_id)
1555 4671 ludovic_arnaud
                                FROM ' . ATTACHMENTS_TABLE . '
1556 6271 acydburn
                                WHERE ' . $db->sql_in_set('post_msg_id', $post_ids) . '
1557 4915 acydburn
                                        AND in_message = 0';
1558 6015 acydburn
                        $result = $db->sql_query($sql);
1559 3961 psotfx
1560 4671 ludovic_arnaud
                        $post_ids = array();
1561 4671 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1562 2286 psotfx
                        {
1563 7330 acydburn
                                if (!isset($post_attachment[$row['post_msg_id']]))
1564 3737 ludovic_arnaud
                                {
1565 7330 acydburn
                                        $post_ids[] = $row['post_msg_id'];
1566 3737 ludovic_arnaud
                                }
1567 4671 ludovic_arnaud
                                else
1568 3760 ludovic_arnaud
                                {
1569 7330 acydburn
                                        unset($post_attachment[$row['post_msg_id']]);
1570 3760 ludovic_arnaud
                                }
1571 4671 ludovic_arnaud
                        }
1572 6015 acydburn
                        $db->sql_freeresult($result);
1573 2286 psotfx
1574 4671 ludovic_arnaud
                        // $post_attachment should be empty by now, if it's not it contains
1575 4671 ludovic_arnaud
                        // posts that are falsely flagged as having attachments
1576 4671 ludovic_arnaud
                        foreach ($post_attachment as $post_id => $void)
1577 4671 ludovic_arnaud
                        {
1578 4671 ludovic_arnaud
                                $post_ids[] = $post_id;
1579 2286 psotfx
                        }
1580 3961 psotfx
1581 5033 acydburn
                        if (sizeof($post_ids))
1582 4671 ludovic_arnaud
                        {
1583 4671 ludovic_arnaud
                                $sql = 'UPDATE ' . POSTS_TABLE . '
1584 4671 ludovic_arnaud
                                        SET post_attachment = 1 - post_attachment
1585 6271 acydburn
                                        WHERE ' . $db->sql_in_set('post_id', $post_ids);
1586 4671 ludovic_arnaud
                                $db->sql_query($sql);
1587 4671 ludovic_arnaud
                        }
1588 9965 acydburn
1589 9937 Kellanved
                        $db->sql_transaction('commit');
1590 9937 Kellanved
                        break;
1591 3737 ludovic_arnaud
1592 4671 ludovic_arnaud
                case 'topic_attachment':
1593 4671 ludovic_arnaud
                        if ($sync_extra)
1594 2286 psotfx
                        {
1595 4671 ludovic_arnaud
                                sync('post_attachment', $where_type, $where_ids);
1596 4671 ludovic_arnaud
                        }
1597 3737 ludovic_arnaud
1598 4671 ludovic_arnaud
                        $topic_ids = $topic_attachment = array();
1599 4671 ludovic_arnaud
1600 9937 Kellanved
                        $db->sql_transaction('begin');
1601 9937 Kellanved
1602 4671 ludovic_arnaud
                        $sql = 'SELECT DISTINCT(t.topic_id)
1603 4671 ludovic_arnaud
                                FROM ' . POSTS_TABLE . " t
1604 4671 ludovic_arnaud
                                $where_sql_and t.post_attachment = 1";
1605 4671 ludovic_arnaud
                        $result = $db->sql_query($sql);
1606 6015 acydburn
1607 4671 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1608 4671 ludovic_arnaud
                        {
1609 4671 ludovic_arnaud
                                $topic_attachment[$row['topic_id']] = 1;
1610 4671 ludovic_arnaud
                        }
1611 6015 acydburn
                        $db->sql_freeresult($result);
1612 4671 ludovic_arnaud
1613 4671 ludovic_arnaud
                        $sql = 'SELECT t.topic_id, t.topic_attachment
1614 4671 ludovic_arnaud
                                FROM ' . TOPICS_TABLE . " t
1615 4671 ludovic_arnaud
                                $where_sql";
1616 4671 ludovic_arnaud
                        $result = $db->sql_query($sql);
1617 6015 acydburn
1618 4671 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1619 4671 ludovic_arnaud
                        {
1620 4671 ludovic_arnaud
                                if ($row['topic_attachment'] ^ isset($topic_attachment[$row['topic_id']]))
1621 3737 ludovic_arnaud
                                {
1622 4671 ludovic_arnaud
                                        $topic_ids[] = $row['topic_id'];
1623 3737 ludovic_arnaud
                                }
1624 4671 ludovic_arnaud
                        }
1625 6015 acydburn
                        $db->sql_freeresult($result);
1626 3737 ludovic_arnaud
1627 5033 acydburn
                        if (sizeof($topic_ids))
1628 4671 ludovic_arnaud
                        {
1629 4671 ludovic_arnaud
                                $sql = 'UPDATE ' . TOPICS_TABLE . '
1630 4671 ludovic_arnaud
                                        SET topic_attachment = 1 - topic_attachment
1631 6271 acydburn
                                        WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
1632 4671 ludovic_arnaud
                                $db->sql_query($sql);
1633 2286 psotfx
                        }
1634 9965 acydburn
1635 9937 Kellanved
                        $db->sql_transaction('commit');
1636 9965 acydburn
1637 9937 Kellanved
                        break;
1638 2286 psotfx
1639 4671 ludovic_arnaud
                case 'forum':
1640 6015 acydburn
1641 9937 Kellanved
                        $db->sql_transaction('begin');
1642 9965 acydburn
1643 5026 bartvb
                        // 1: Get the list of all forums
1644 4534 ludovic_arnaud
                        $sql = 'SELECT f.*
1645 4534 ludovic_arnaud
                                FROM ' . FORUMS_TABLE . " f
1646 4534 ludovic_arnaud
                                $where_sql";
1647 3961 psotfx
                        $result = $db->sql_query($sql);
1648 3737 ludovic_arnaud
1649 4534 ludovic_arnaud
                        $forum_data = $forum_ids = $post_ids = $last_post_id = $post_info = array();
1650 3737 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1651 3737 ludovic_arnaud
                        {
1652 3961 psotfx
                                if ($row['forum_type'] == FORUM_LINK)
1653 3961 psotfx
                                {
1654 3961 psotfx
                                        continue;
1655 3961 psotfx
                                }
1656 3961 psotfx
1657 4534 ludovic_arnaud
                                $forum_id = (int) $row['forum_id'];
1658 4534 ludovic_arnaud
                                $forum_ids[$forum_id] = $forum_id;
1659 4534 ludovic_arnaud
1660 4534 ludovic_arnaud
                                $forum_data[$forum_id] = $row;
1661 7466 davidmj
                                if ($sync_extra)
1662 7466 davidmj
                                {
1663 7466 davidmj
                                        $forum_data[$forum_id]['posts'] = 0;
1664 7466 davidmj
                                        $forum_data[$forum_id]['topics'] = 0;
1665 7466 davidmj
                                        $forum_data[$forum_id]['topics_real'] = 0;
1666 7466 davidmj
                                }
1667 4534 ludovic_arnaud
                                $forum_data[$forum_id]['last_post_id'] = 0;
1668 6360 grahamje
                                $forum_data[$forum_id]['last_post_subject'] = '';
1669 4534 ludovic_arnaud
                                $forum_data[$forum_id]['last_post_time'] = 0;
1670 4534 ludovic_arnaud
                                $forum_data[$forum_id]['last_poster_id'] = 0;
1671 4534 ludovic_arnaud
                                $forum_data[$forum_id]['last_poster_name'] = '';
1672 6315 grahamje
                                $forum_data[$forum_id]['last_poster_colour'] = '';
1673 3737 ludovic_arnaud
                        }
1674 6015 acydburn
                        $db->sql_freeresult($result);
1675 2286 psotfx
1676 6114 acydburn
                        if (!sizeof($forum_ids))
1677 6114 acydburn
                        {
1678 6114 acydburn
                                break;
1679 6114 acydburn
                        }
1680 6114 acydburn
1681 6411 acydburn
                        $forum_ids = array_values($forum_ids);
1682 6411 acydburn
1683 7466 davidmj
                        // 2: Get topic counts for each forum (optional)
1684 7466 davidmj
                        if ($sync_extra)
1685 7466 davidmj
                        {
1686 7466 davidmj
                                $sql = 'SELECT forum_id, topic_approved, COUNT(topic_id) AS forum_topics
1687 7466 davidmj
                                        FROM ' . TOPICS_TABLE . '
1688 7466 davidmj
                                        WHERE ' . $db->sql_in_set('forum_id', $forum_ids) . '
1689 7466 davidmj
                                        GROUP BY forum_id, topic_approved';
1690 7466 davidmj
                                $result = $db->sql_query($sql);
1691 6015 acydburn
1692 7466 davidmj
                                while ($row = $db->sql_fetchrow($result))
1693 7466 davidmj
                                {
1694 7466 davidmj
                                        $forum_id = (int) $row['forum_id'];
1695 7466 davidmj
                                        $forum_data[$forum_id]['topics_real'] += $row['forum_topics'];
1696 7466 davidmj
1697 7466 davidmj
                                        if ($row['topic_approved'])
1698 7466 davidmj
                                        {
1699 7466 davidmj
                                                $forum_data[$forum_id]['topics'] = $row['forum_topics'];
1700 7466 davidmj
                                        }
1701 7466 davidmj
                                }
1702 7466 davidmj
                                $db->sql_freeresult($result);
1703 7466 davidmj
                        }
1704 7466 davidmj
1705 7466 davidmj
                        // 3: Get post count for each forum (optional)
1706 7466 davidmj
                        if ($sync_extra)
1707 3737 ludovic_arnaud
                        {
1708 7466 davidmj
                                if (sizeof($forum_ids) == 1)
1709 7466 davidmj
                                {
1710 7485 acydburn
                                        $sql = 'SELECT SUM(t.topic_replies + 1) AS forum_posts
1711 7466 davidmj
                                                FROM ' . TOPICS_TABLE . ' t
1712 7466 davidmj
                                                WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
1713 8506 davidmj
                                                        AND t.topic_approved = 1
1714 8506 davidmj
                                                        AND t.topic_status <> ' . ITEM_MOVED;
1715 7466 davidmj
                                }
1716 7466 davidmj
                                else
1717 7466 davidmj
                                {
1718 7485 acydburn
                                        $sql = 'SELECT t.forum_id, SUM(t.topic_replies + 1) AS forum_posts
1719 7466 davidmj
                                                FROM ' . TOPICS_TABLE . ' t
1720 7466 davidmj
                                                WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
1721 7466 davidmj
                                                        AND t.topic_approved = 1
1722 8508 davidmj
                                                        AND t.topic_status <> ' . ITEM_MOVED . '
1723 7485 acydburn
                                                GROUP BY t.forum_id';
1724 7466 davidmj
                                }
1725 3961 psotfx
1726 7466 davidmj
                                $result = $db->sql_query($sql);
1727 7466 davidmj
1728 7466 davidmj
                                while ($row = $db->sql_fetchrow($result))
1729 3737 ludovic_arnaud
                                {
1730 7466 davidmj
                                        $forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
1731 7466 davidmj
1732 7466 davidmj
                                        $forum_data[$forum_id]['posts'] = (int) $row['forum_posts'];
1733 3737 ludovic_arnaud
                                }
1734 7466 davidmj
                                $db->sql_freeresult($result);
1735 3737 ludovic_arnaud
                        }
1736 2286 psotfx
1737 7466 davidmj
                        // 4: Get last_post_id for each forum
1738 6411 acydburn
                        if (sizeof($forum_ids) == 1)
1739 6411 acydburn
                        {
1740 7466 davidmj
                                $sql = 'SELECT MAX(t.topic_last_post_id) as last_post_id
1741 7466 davidmj
                                        FROM ' . TOPICS_TABLE . ' t
1742 7466 davidmj
                                        WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
1743 7466 davidmj
                                                AND t.topic_approved = 1';
1744 6411 acydburn
                        }
1745 6411 acydburn
                        else
1746 6411 acydburn
                        {
1747 7466 davidmj
                                $sql = 'SELECT t.forum_id, MAX(t.topic_last_post_id) as last_post_id
1748 7466 davidmj
                                        FROM ' . TOPICS_TABLE . ' t
1749 7466 davidmj
                                        WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
1750 7191 naderman
                                                AND t.topic_approved = 1
1751 7468 davidmj
                                        GROUP BY t.forum_id';
1752 6411 acydburn
                        }
1753 6411 acydburn
1754 3737 ludovic_arnaud
                        $result = $db->sql_query($sql);
1755 6015 acydburn
1756 3737 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1757 3737 ludovic_arnaud
                        {
1758 6411 acydburn
                                $forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
1759 2286 psotfx
1760 6015 acydburn
                                $forum_data[$forum_id]['last_post_id'] = (int) $row['last_post_id'];
1761 3961 psotfx
1762 4534 ludovic_arnaud
                                $post_ids[] = $row['last_post_id'];
1763 3737 ludovic_arnaud
                        }
1764 6015 acydburn
                        $db->sql_freeresult($result);
1765 3737 ludovic_arnaud
1766 7466 davidmj
                        // 5: Retrieve last_post infos
1767 5033 acydburn
                        if (sizeof($post_ids))
1768 3737 ludovic_arnaud
                        {
1769 6360 grahamje
                                $sql = 'SELECT p.post_id, p.poster_id, p.post_subject, p.post_time, p.post_username, u.username, u.user_colour
1770 3737 ludovic_arnaud
                                        FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
1771 6271 acydburn
                                        WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
1772 3737 ludovic_arnaud
                                                AND p.poster_id = u.user_id';
1773 3737 ludovic_arnaud
                                $result = $db->sql_query($sql);
1774 6015 acydburn
1775 3737 ludovic_arnaud
                                while ($row = $db->sql_fetchrow($result))
1776 3737 ludovic_arnaud
                                {
1777 6015 acydburn
                                        $post_info[$row['post_id']] = $row;
1778 3737 ludovic_arnaud
                                }
1779 3833 psotfx
                                $db->sql_freeresult($result);
1780 3737 ludovic_arnaud
1781 3737 ludovic_arnaud
                                foreach ($forum_data as $forum_id => $data)
1782 3737 ludovic_arnaud
                                {
1783 3737 ludovic_arnaud
                                        if ($data['last_post_id'])
1784 3737 ludovic_arnaud
                                        {
1785 4534 ludovic_arnaud
                                                if (isset($post_info[$data['last_post_id']]))
1786 4534 ludovic_arnaud
                                                {
1787 6360 grahamje
                                                        $forum_data[$forum_id]['last_post_subject'] = $post_info[$data['last_post_id']]['post_subject'];
1788 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_post_time'] = $post_info[$data['last_post_id']]['post_time'];
1789 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_poster_id'] = $post_info[$data['last_post_id']]['poster_id'];
1790 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_poster_name'] = ($post_info[$data['last_post_id']]['poster_id'] != ANONYMOUS) ? $post_info[$data['last_post_id']]['username'] : $post_info[$data['last_post_id']]['post_username'];
1791 6315 grahamje
                                                        $forum_data[$forum_id]['last_poster_colour'] = $post_info[$data['last_post_id']]['user_colour'];
1792 4534 ludovic_arnaud
                                                }
1793 4534 ludovic_arnaud
                                                else
1794 4534 ludovic_arnaud
                                                {
1795 4534 ludovic_arnaud
                                                        // For some reason we did not find the post in the db
1796 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_post_id'] = 0;
1797 6360 grahamje
                                                        $forum_data[$forum_id]['last_post_subject'] = '';
1798 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_post_time'] = 0;
1799 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_poster_id'] = 0;
1800 4534 ludovic_arnaud
                                                        $forum_data[$forum_id]['last_poster_name'] = '';
1801 6315 grahamje
                                                        $forum_data[$forum_id]['last_poster_colour'] = '';
1802 4534 ludovic_arnaud
                                                }
1803 3737 ludovic_arnaud
                                        }
1804 3737 ludovic_arnaud
                                }
1805 4534 ludovic_arnaud
                                unset($post_info);
1806 3737 ludovic_arnaud
                        }
1807 3737 ludovic_arnaud
1808 7466 davidmj
                        // 6: Now do that thing
1809 7466 davidmj
                        $fieldnames = array('last_post_id', 'last_post_subject', 'last_post_time', 'last_poster_id', 'last_poster_name', 'last_poster_colour');
1810 3737 ludovic_arnaud
1811 7466 davidmj
                        if ($sync_extra)
1812 7466 davidmj
                        {
1813 7466 davidmj
                                array_push($fieldnames, 'posts', 'topics', 'topics_real');
1814 7466 davidmj
                        }
1815 7466 davidmj
1816 3737 ludovic_arnaud
                        foreach ($forum_data as $forum_id => $row)
1817 3737 ludovic_arnaud
                        {
1818 6015 acydburn
                                $sql_ary = array();
1819 3737 ludovic_arnaud
1820 3737 ludovic_arnaud
                                foreach ($fieldnames as $fieldname)
1821 3737 ludovic_arnaud
                                {
1822 4534 ludovic_arnaud
                                        if ($row['forum_' . $fieldname] != $row[$fieldname])
1823 3737 ludovic_arnaud
                                        {
1824 6360 grahamje
                                                if (preg_match('#(name|colour|subject)$#', $fieldname))
1825 3737 ludovic_arnaud
                                                {
1826 6015 acydburn
                                                        $sql_ary['forum_' . $fieldname] = (string) $row[$fieldname];
1827 3737 ludovic_arnaud
                                                }
1828 3737 ludovic_arnaud
                                                else
1829 3737 ludovic_arnaud
                                                {
1830 6015 acydburn
                                                        $sql_ary['forum_' . $fieldname] = (int) $row[$fieldname];
1831 3737 ludovic_arnaud
                                                }
1832 3737 ludovic_arnaud
                                        }
1833 4534 ludovic_arnaud
                                }
1834 3737 ludovic_arnaud
1835 6015 acydburn
                                if (sizeof($sql_ary))
1836 4534 ludovic_arnaud
                                {
1837 4534 ludovic_arnaud
                                        $sql = 'UPDATE ' . FORUMS_TABLE . '
1838 6015 acydburn
                                                SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
1839 4534 ludovic_arnaud
                                                WHERE forum_id = ' . $forum_id;
1840 3737 ludovic_arnaud
                                        $db->sql_query($sql);
1841 3737 ludovic_arnaud
                                }
1842 3737 ludovic_arnaud
                        }
1843 9965 acydburn
1844 9937 Kellanved
                        $db->sql_transaction('commit');
1845 9937 Kellanved
                        break;
1846 3737 ludovic_arnaud
1847 2286 psotfx
                case 'topic':
1848 6271 acydburn
                        $topic_data = $post_ids = $approved_unapproved_ids = $resync_forums = $delete_topics = $delete_posts = $moved_topics = array();
1849 3737 ludovic_arnaud
1850 9937 Kellanved
                        $db->sql_transaction('begin');
1851 9965 acydburn
1852 6360 grahamje
                        $sql = 'SELECT t.topic_id, t.forum_id, t.topic_moved_id, t.topic_approved, ' . (($sync_extra) ? 't.topic_attachment, t.topic_reported, ' : '') . 't.topic_poster, t.topic_time, t.topic_replies, t.topic_replies_real, t.topic_first_post_id, t.topic_first_poster_name, t.topic_first_poster_colour, t.topic_last_post_id, t.topic_last_post_subject, t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_poster_colour, t.topic_last_post_time
1853 4534 ludovic_arnaud
                                FROM ' . TOPICS_TABLE . " t
1854 4534 ludovic_arnaud
                                $where_sql";
1855 3961 psotfx
                        $result = $db->sql_query($sql);
1856 3737 ludovic_arnaud
1857 3737 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1858 3737 ludovic_arnaud
                        {
1859 6271 acydburn
                                if ($row['topic_moved_id'])
1860 6271 acydburn
                                {
1861 6271 acydburn
                                        $moved_topics[] = $row['topic_id'];
1862 6271 acydburn
                                        continue;
1863 6271 acydburn
                                }
1864 6271 acydburn
1865 4534 ludovic_arnaud
                                $topic_id = (int) $row['topic_id'];
1866 4534 ludovic_arnaud
                                $topic_data[$topic_id] = $row;
1867 4534 ludovic_arnaud
                                $topic_data[$topic_id]['replies_real'] = -1;
1868 6411 acydburn
                                $topic_data[$topic_id]['replies'] = 0;
1869 4534 ludovic_arnaud
                                $topic_data[$topic_id]['first_post_id'] = 0;
1870 4534 ludovic_arnaud
                                $topic_data[$topic_id]['last_post_id'] = 0;
1871 4534 ludovic_arnaud
                                unset($topic_data[$topic_id]['topic_id']);
1872 2286 psotfx
1873 4671 ludovic_arnaud
                                // This array holds all topic_ids
1874 4671 ludovic_arnaud
                                $delete_topics[$topic_id] = '';
1875 4671 ludovic_arnaud
1876 4534 ludovic_arnaud
                                if ($sync_extra)
1877 3737 ludovic_arnaud
                                {
1878 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['reported'] = 0;
1879 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['attachment'] = 0;
1880 3737 ludovic_arnaud
                                }
1881 4534 ludovic_arnaud
                        }
1882 4534 ludovic_arnaud
                        $db->sql_freeresult($result);
1883 4534 ludovic_arnaud
1884 4534 ludovic_arnaud
                        // Use "t" as table alias because of the $where_sql clause
1885 5033 acydburn
                        // NOTE: 't.post_approved' in the GROUP BY is causing a major slowdown.
1886 4534 ludovic_arnaud
                        $sql = 'SELECT t.topic_id, t.post_approved, COUNT(t.post_id) AS total_posts, MIN(t.post_id) AS first_post_id, MAX(t.post_id) AS last_post_id
1887 4534 ludovic_arnaud
                                FROM ' . POSTS_TABLE . " t
1888 6411 acydburn
                                $where_sql
1889 6411 acydburn
                                GROUP BY t.topic_id, t.post_approved";
1890 4534 ludovic_arnaud
                        $result = $db->sql_query($sql);
1891 4534 ludovic_arnaud
1892 4534 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1893 4534 ludovic_arnaud
                        {
1894 4534 ludovic_arnaud
                                $topic_id = (int) $row['topic_id'];
1895 4534 ludovic_arnaud
1896 4534 ludovic_arnaud
                                $row['first_post_id'] = (int) $row['first_post_id'];
1897 4534 ludovic_arnaud
                                $row['last_post_id'] = (int) $row['last_post_id'];
1898 4534 ludovic_arnaud
1899 4534 ludovic_arnaud
                                if (!isset($topic_data[$topic_id]))
1900 4534 ludovic_arnaud
                                {
1901 4534 ludovic_arnaud
                                        // Hey, these posts come from a topic that does not exist
1902 4534 ludovic_arnaud
                                        $delete_posts[$topic_id] = '';
1903 4534 ludovic_arnaud
                                }
1904 3737 ludovic_arnaud
                                else
1905 3737 ludovic_arnaud
                                {
1906 4534 ludovic_arnaud
                                        // Unset the corresponding entry in $delete_topics
1907 4534 ludovic_arnaud
                                        // When we'll be done, only topics with no posts will remain
1908 4534 ludovic_arnaud
                                        unset($delete_topics[$topic_id]);
1909 3737 ludovic_arnaud
1910 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['replies_real'] += $row['total_posts'];
1911 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['first_post_id'] = (!$topic_data[$topic_id]['first_post_id']) ? $row['first_post_id'] : min($topic_data[$topic_id]['first_post_id'], $row['first_post_id']);
1912 4534 ludovic_arnaud
1913 4534 ludovic_arnaud
                                        if ($row['post_approved'] || !$topic_data[$topic_id]['last_post_id'])
1914 3737 ludovic_arnaud
                                        {
1915 4534 ludovic_arnaud
                                                $topic_data[$topic_id]['replies'] = $row['total_posts'] - 1;
1916 4534 ludovic_arnaud
                                                $topic_data[$topic_id]['last_post_id'] = $row['last_post_id'];
1917 3737 ludovic_arnaud
                                        }
1918 3737 ludovic_arnaud
                                }
1919 3737 ludovic_arnaud
                        }
1920 4507 ludovic_arnaud
                        $db->sql_freeresult($result);
1921 3737 ludovic_arnaud
1922 3737 ludovic_arnaud
                        foreach ($topic_data as $topic_id => $row)
1923 2286 psotfx
                        {
1924 3737 ludovic_arnaud
                                $post_ids[] = $row['first_post_id'];
1925 3737 ludovic_arnaud
                                if ($row['first_post_id'] != $row['last_post_id'])
1926 3737 ludovic_arnaud
                                {
1927 3737 ludovic_arnaud
                                        $post_ids[] = $row['last_post_id'];
1928 3737 ludovic_arnaud
                                }
1929 2286 psotfx
                        }
1930 2286 psotfx
1931 4534 ludovic_arnaud
                        // Now we delete empty topics and orphan posts
1932 5033 acydburn
                        if (sizeof($delete_posts))
1933 3737 ludovic_arnaud
                        {
1934 5313 acydburn
                                delete_posts('topic_id', array_keys($delete_posts), false);
1935 4534 ludovic_arnaud
                                unset($delete_posts);
1936 4534 ludovic_arnaud
                        }
1937 5033 acydburn
1938 5033 acydburn
                        if (!sizeof($topic_data))
1939 4534 ludovic_arnaud
                        {
1940 3737 ludovic_arnaud
                                // If we get there, topic ids were invalid or topics did not contain any posts
1941 5313 acydburn
                                delete_topics($where_type, $where_ids, true);
1942 3737 ludovic_arnaud
                                return;
1943 3737 ludovic_arnaud
                        }
1944 6015 acydburn
1945 5033 acydburn
                        if (sizeof($delete_topics))
1946 3737 ludovic_arnaud
                        {
1947 4671 ludovic_arnaud
                                $delete_topic_ids = array();
1948 4671 ludovic_arnaud
                                foreach ($delete_topics as $topic_id => $void)
1949 4671 ludovic_arnaud
                                {
1950 4671 ludovic_arnaud
                                        unset($topic_data[$topic_id]);
1951 4671 ludovic_arnaud
                                        $delete_topic_ids[] = $topic_id;
1952 4671 ludovic_arnaud
                                }
1953 4671 ludovic_arnaud
1954 5313 acydburn
                                delete_topics('topic_id', $delete_topic_ids, false);
1955 4671 ludovic_arnaud
                                unset($delete_topics, $delete_topic_ids);
1956 3737 ludovic_arnaud
                        }
1957 2664 psotfx
1958 6360 grahamje
                        $sql = 'SELECT p.post_id, p.topic_id, p.post_approved, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
1959 3737 ludovic_arnaud
                                FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
1960 6271 acydburn
                                WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
1961 3737 ludovic_arnaud
                                        AND u.user_id = p.poster_id';
1962 3961 psotfx
                        $result = $db->sql_query($sql);
1963 3760 ludovic_arnaud
1964 3760 ludovic_arnaud
                        $post_ids = array();
1965 3737 ludovic_arnaud
                        while ($row = $db->sql_fetchrow($result))
1966 3737 ludovic_arnaud
                        {
1967 4534 ludovic_arnaud
                                $topic_id = intval($row['topic_id']);
1968 4534 ludovic_arnaud
1969 4534 ludovic_arnaud
                                if ($row['post_id'] == $topic_data[$topic_id]['first_post_id'])
1970 3737 ludovic_arnaud
                                {
1971 4534 ludovic_arnaud
                                        if ($topic_data[$topic_id]['topic_approved'] != $row['post_approved'])
1972 3737 ludovic_arnaud
                                        {
1973 4534 ludovic_arnaud
                                                $approved_unapproved_ids[] = $topic_id;
1974 3737 ludovic_arnaud
                                        }
1975 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['time'] = $row['post_time'];
1976 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['poster'] = $row['poster_id'];
1977 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['first_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'];
1978 6309 grahamje
                                        $topic_data[$topic_id]['first_poster_colour'] = $row['user_colour'];
1979 3737 ludovic_arnaud
                                }
1980 6015 acydburn
1981 4534 ludovic_arnaud
                                if ($row['post_id'] == $topic_data[$topic_id]['last_post_id'])
1982 3737 ludovic_arnaud
                                {
1983 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['last_poster_id'] = $row['poster_id'];
1984 6360 grahamje
                                        $topic_data[$topic_id]['last_post_subject'] = $row['post_subject'];
1985 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['last_post_time'] = $row['post_time'];
1986 4534 ludovic_arnaud
                                        $topic_data[$topic_id]['last_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'];
1987 6309 grahamje
                                        $topic_data[$topic_id]['last_poster_colour'] = $row['user_colour'];
1988 3737 ludovic_arnaud
                                }
1989 3737 ludovic_arnaud
                        }
1990 4507 ludovic_arnaud
                        $db->sql_freeresult($result);
1991 2942 psotfx
1992 7188 acydburn
                        // Make sure shadow topics do link to existing topics
1993 7188 acydburn
                        if (sizeof($moved_topics))
1994 7188 acydburn
                        {
1995 7188 acydburn
                                $delete_topics = array();
1996 7188 acydburn
1997 7188 acydburn
                                $sql = 'SELECT t1.topic_id, t1.topic_moved_id
1998 7188 acydburn
                                        FROM ' . TOPICS_TABLE . ' t1
1999 7188 acydburn
                                        LEFT JOIN ' . TOPICS_TABLE . ' t2 ON (t2.topic_id = t1.topic_moved_id)
2000 7188 acydburn
                                        WHERE ' . $db->sql_in_set('t1.topic_id', $moved_topics) . '
2001 7188 acydburn
                                                AND t2.topic_id IS NULL';
2002 7188 acydburn
                                $result = $db->sql_query($sql);
2003 7188 acydburn
2004 7188 acydburn
                                while ($row = $db->sql_fetchrow($result))
2005 7188 acydburn
                                {
2006 7188 acydburn
                                        $delete_topics[] = $row['topic_id'];
2007 7188 acydburn
                                }
2008 7188 acydburn
                                $db->sql_freeresult($result);
2009 7188 acydburn
2010 7188 acydburn
                                if (sizeof($delete_topics))
2011 7188 acydburn
                                {
2012 7188 acydburn
                                        delete_topics('topic_id', $delete_topics, false);
2013 7188 acydburn
                                }
2014 7188 acydburn
                                unset($delete_topics);
2015 7188 acydburn
2016 7188 acydburn
                                // Make sure shadow topics having no last post data being updated (this only rarely happens...)
2017 7188 acydburn
                                $sql = 'SELECT topic_id, topic_moved_id, topic_last_post_id, topic_first_post_id
2018 7188 acydburn
                                        FROM ' . TOPICS_TABLE . '
2019 7188 acydburn
                                        WHERE ' . $db->sql_in_set('topic_id', $moved_topics) . '
2020 7188 acydburn
                                                AND topic_last_post_time = 0';
2021 7188 acydburn
                                $result = $db->sql_query($sql);
2022 7188 acydburn
2023 7188 acydburn
                                $shadow_topic_data = $post_ids = array();
2024 7188 acydburn
                                while ($row = $db->sql_fetchrow($result))
2025 7188 acydburn
                                {
2026 7188 acydburn
                                        $shadow_topic_data[$row['topic_moved_id']] = $row;
2027 7188 acydburn
                                        $post_ids[] = $row['topic_last_post_id'];
2028 7188 acydburn
                                        $post_ids[] = $row['topic_first_post_id'];
2029 7188 acydburn
                                }
2030 7188 acydburn
                                $db->sql_freeresult($result);
2031 7188 acydburn
2032 7188 acydburn
                                $sync_shadow_topics = array();
2033 7188 acydburn
                                if (sizeof($post_ids))
2034 7188 acydburn
                                {
2035 7188 acydburn
                                        $sql = 'SELECT p.post_id, p.topic_id, p.post_approved, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
2036 7188 acydburn
                                                FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
2037 7188 acydburn
                                                WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
2038 7188 acydburn
                                                        AND u.user_id = p.poster_id';
2039 7188 acydburn
                                        $result = $db->sql_query($sql);
2040 7188 acydburn
2041 7188 acydburn
                                        $post_ids = array();
2042 7188 acydburn
                                        while ($row = $db->sql_fetchrow($result))
2043 7188 acydburn
                                        {
2044 7188 acydburn
                                                $topic_id = (int) $row['topic_id'];
2045 7188 acydburn
2046 8146 acydburn
                                                // Ok, there should be a shadow topic. If there isn't, then there's something wrong with the db.
2047 7648 kellanved
                                                // However, there's not much we can do about it.
2048 7648 kellanved
                                                if (!empty($shadow_topic_data[$topic_id]))
2049 7188 acydburn
                                                {
2050 7648 kellanved
                                                        if ($row['post_id'] == $shadow_topic_data[$topic_id]['topic_first_post_id'])
2051 7648 kellanved
                                                        {
2052 7648 kellanved
                                                                $orig_topic_id = $shadow_topic_data[$topic_id]['topic_id'];
2053 7188 acydburn
2054 7648 kellanved
                                                                if (!isset($sync_shadow_topics[$orig_topic_id]))
2055 7648 kellanved
                                                                {
2056 7648 kellanved
                                                                        $sync_shadow_topics[$orig_topic_id] = array();
2057 7648 kellanved
                                                                }
2058 7648 kellanved
2059 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_time'] = $row['post_time'];
2060 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_poster'] = $row['poster_id'];
2061 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_first_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'];
2062 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_first_poster_colour'] = $row['user_colour'];
2063 7188 acydburn
                                                        }
2064 7188 acydburn
2065 7648 kellanved
                                                        if ($row['post_id'] == $shadow_topic_data[$topic_id]['topic_last_post_id'])
2066 7648 kellanved
                                                        {
2067 7648 kellanved
                                                                $orig_topic_id = $shadow_topic_data[$topic_id]['topic_id'];
2068 7188 acydburn
2069 7648 kellanved
                                                                if (!isset($sync_shadow_topics[$orig_topic_id]))
2070 7648 kellanved
                                                                {
2071 7648 kellanved
                                                                        $sync_shadow_topics[$orig_topic_id] = array();
2072 7648 kellanved
                                                                }
2073 7188 acydburn
2074 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_last_poster_id'] = $row['poster_id'];
2075 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_last_post_subject'] = $row['post_subject'];
2076 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_last_post_time'] = $row['post_time'];
2077 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_last_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'];
2078 7648 kellanved
                                                                $sync_shadow_topics[$orig_topic_id]['topic_last_poster_colour'] = $row['user_colour'];
2079 7188 acydburn
                                                        }
2080 7188 acydburn
                                                }
2081 7188 acydburn
                                        }
2082 7188 acydburn
                                        $db->sql_freeresult($result);
2083 7188 acydburn
2084 7188 acydburn
                                        $shadow_topic_data = array();
2085 7188 acydburn
2086 7188 acydburn
                                        // Update the information we collected
2087 7188 acydburn
                                        if (sizeof($sync_shadow_topics))
2088 7188 acydburn
                                        {
2089 7188 acydburn
                                                foreach ($sync_shadow_topics as $sync_topic_id => $sql_ary)
2090 7188 acydburn
                                                {
2091 7188 acydburn
                                                        $sql = 'UPDATE ' . TOPICS_TABLE . '
2092 7188 acydburn
                                                                SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
2093 7188 acydburn
                                                                WHERE topic_id = ' . $sync_topic_id;
2094 7188 acydburn
                                                        $db->sql_query($sql);
2095 7188 acydburn
                                                }
2096 7188 acydburn
                                        }
2097 7188 acydburn
                                }
2098 7188 acydburn
2099 7188 acydburn
                                unset($sync_shadow_topics, $shadow_topic_data);
2100 7188 acydburn
                        }
2101 7188 acydburn
2102 3760 ludovic_arnaud
                        // approved becomes unapproved, and vice-versa
2103 5033 acydburn
                        if (sizeof($approved_unapproved_ids))
2104 3737 ludovic_arnaud
                        {
2105 3737 ludovic_arnaud
                                $sql = 'UPDATE ' . TOPICS_TABLE . '
2106 3760 ludovic_arnaud
                                        SET topic_approved = 1 - topic_approved
2107 6271 acydburn
                                        WHERE ' . $db->sql_in_set('topic_id', $approved_unapproved_ids);
2108 3737 ludovic_arnaud
                                $db->sql_query($sql);
2109 3737 ludovic_arnaud
                        }
2110 4507 ludovic_arnaud
                        unset($approved_unapproved_ids);
2111 3760 ludovic_arnaud
2112 5026 bartvb
                        // These are fields that will be synchronised
2113 6360 grahamje
                        $fieldnames = array('time', 'replies', 'replies_real', 'poster', 'first_post_id', 'first_poster_name', 'first_poster_colour', 'last_post_id', 'last_post_subject', 'last_post_time', 'last_poster_id', 'last_poster_name', 'last_poster_colour');
2114 3760 ludovic_arnaud
2115 3760 ludovic_arnaud
                        if ($sync_extra)
2116 3737 ludovic_arnaud
                        {
2117 3760 ludovic_arnaud
                                // This routine assumes that post_reported values are correct
2118 4671 ludovic_arnaud
                                // if they are not, use sync('post_reported') first
2119 3760 ludovic_arnaud
                                $sql = 'SELECT t.topic_id, p.post_id
2120 3760 ludovic_arnaud
                                        FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
2121 3760 ludovic_arnaud
                                        $where_sql_and p.topic_id = t.topic_id
2122 3760 ludovic_arnaud
                                                AND p.post_reported = 1
2123 5933 acydburn
                                        GROUP BY t.topic_id, p.post_id";
2124 3961 psotfx
                                $result = $db->sql_query($sql);
2125 3760 ludovic_arnaud
2126 3961 psotfx
                                $fieldnames[] = 'reported';
2127 3760 ludovic_arnaud
                                while ($row = $db->sql_fetchrow($result))
2128 3760 ludovic_arnaud
                                {
2129 4534 ludovic_arnaud
                                        $topic_data[intval($row['topic_id'])]['reported'] = 1;
2130 3760 ludovic_arnaud
                                }
2131 3961 psotfx
                                $db->sql_freeresult($result);
2132 3760 ludovic_arnaud
2133 3936 ludovic_arnaud
                                // This routine assumes that post_attachment values are correct
2134 4671 ludovic_arnaud
                                // if they are not, use sync('post_attachment') first
2135 3936 ludovic_arnaud
                                $sql = 'SELECT t.topic_id, p.post_id
2136 3936 ludovic_arnaud
                                        FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
2137 3936 ludovic_arnaud
                                        $where_sql_and p.topic_id = t.topic_id
2138 3936 ludovic_arnaud
                                                AND p.post_attachment = 1
2139 5933 acydburn
                                        GROUP BY t.topic_id, p.post_id";
2140 3961 psotfx
                                $result = $db->sql_query($sql);
2141 3936 ludovic_arnaud
2142 3961 psotfx
                                $fieldnames[] = 'attachment';
2143 3936 ludovic_arnaud
                                while ($row = $db->sql_fetchrow($result))
2144 3936 ludovic_arnaud
                                {
2145 4534 ludovic_arnaud
                                        $topic_data[intval($row['topic_id'])]['attachment'] = 1;
2146 3936 ludovic_arnaud
                                }
2147 3961 psotfx
                                $db->sql_freeresult($result);
2148 3737 ludovic_arnaud
                        }
2149 2664 psotfx
2150 3737 ludovic_arnaud
                        foreach ($topic_data as $topic_id => $row)
2151 3737 ludovic_arnaud
                        {
2152 6015 acydburn
                                $sql_ary = array();
2153 2664 psotfx
2154 3737 ludovic_arnaud
                                foreach ($fieldnames as $fieldname)
2155 3737 ludovic_arnaud
                                {
2156 6345 acydburn
                                        if (isset($row[$fieldname]) && isset($row['topic_' . $fieldname]) && $row['topic_' . $fieldname] != $row[$fieldname])
2157 3737 ludovic_arnaud
                                        {
2158 6015 acydburn
                                                $sql_ary['topic_' . $fieldname] = $row[$fieldname];
2159 3737 ludovic_arnaud
                                        }
2160 4534 ludovic_arnaud
                                }
2161 2664 psotfx
2162 6015 acydburn
                                if (sizeof($sql_ary))
2163 4534 ludovic_arnaud
                                {
2164 3737 ludovic_arnaud
                                        $sql = 'UPDATE ' . TOPICS_TABLE . '
2165 6015 acydburn
                                                SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
2166 3961 psotfx
                                                WHERE topic_id = ' . $topic_id;
2167 3737 ludovic_arnaud
                                        $db->sql_query($sql);
2168 2664 psotfx
2169 4534 ludovic_arnaud
                                        $resync_forums[$row['forum_id']] = $row['forum_id'];
2170 3737 ludovic_arnaud
                                }
2171 3737 ludovic_arnaud
                        }
2172 3760 ludovic_arnaud
                        unset($topic_data);
2173 2664 psotfx
2174 9937 Kellanved
                        $db->sql_transaction('commit');
2175 9965 acydburn
2176 3737 ludovic_arnaud
                        // if some topics have been resync'ed then resync parent forums
2177 5313 acydburn
                        // except when we're only syncing a range, we don't want to sync forums during
2178 5313 acydburn
                        // batch processing.
2179 5076 bartvb
                        if ($resync_parents && sizeof($resync_forums) && $where_type != 'range')
2180 3737 ludovic_arnaud
                        {
2181 7466 davidmj
                                sync('forum', 'forum_id', array_values($resync_forums), true, true);
2182 3737 ludovic_arnaud
                        }
2183 9937 Kellanved
                        break;
2184 3737 ludovic_arnaud
        }
2185 6015 acydburn
2186 6015 acydburn
        return;
2187 3737 ludovic_arnaud
}
2188 2664 psotfx
2189 5114 acydburn
/**
2190 5114 acydburn
* Prune function
2191 5114 acydburn
*/
2192 4482 acydburn
function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync = true)
2193 2664 psotfx
{
2194 3737 ludovic_arnaud
        global $db;
2195 2664 psotfx
2196 6271 acydburn
        if (!is_array($forum_id))
2197 6271 acydburn
        {
2198 6271 acydburn
                $forum_id = array($forum_id);
2199 6271 acydburn
        }
2200 3992 psotfx
2201 6271 acydburn
        if (!sizeof($forum_id))
2202 6271 acydburn
        {
2203 6271 acydburn
                return;
2204 6271 acydburn
        }
2205 6271 acydburn
2206 3989 psotfx
        $sql_and = '';
2207 6271 acydburn
2208 6364 acydburn
        if (!($prune_flags & FORUM_FLAG_PRUNE_ANNOUNCE))
2209 3989 psotfx
        {
2210 3989 psotfx
                $sql_and .= ' AND topic_type <> ' . POST_ANNOUNCE;
2211 3989 psotfx
        }
2212 5325 acydburn
2213 6364 acydburn
        if (!($prune_flags & FORUM_FLAG_PRUNE_STICKY))
2214 3989 psotfx
        {
2215 3989 psotfx
                $sql_and .= ' AND topic_type <> ' . POST_STICKY;
2216 3989 psotfx
        }
2217 3989 psotfx
2218 4482 acydburn
        if ($prune_mode == 'posted')
2219 4482 acydburn
        {
2220 4482 acydburn
                $sql_and .= " AND topic_last_post_time < $prune_date";
2221 4482 acydburn
        }
2222 5325 acydburn
2223 4482 acydburn
        if ($prune_mode == 'viewed')
2224 4482 acydburn
        {
2225 4482 acydburn
                $sql_and .= " AND topic_last_view_time < $prune_date";
2226 4482 acydburn
        }
2227 4482 acydburn
2228 3737 ludovic_arnaud
        $sql = 'SELECT topic_id
2229 6271 acydburn
                FROM ' . TOPICS_TABLE . '
2230 6271 acydburn
                WHERE ' . $db->sql_in_set('forum_id', $forum_id) . "
2231 8146 acydburn
                        AND poll_start = 0
2232 3989 psotfx
                        $sql_and";
2233 2664 psotfx
        $result = $db->sql_query($sql);
2234 2664 psotfx
2235 3737 ludovic_arnaud
        $topic_list = array();
2236 3737 ludovic_arnaud
        while ($row = $db->sql_fetchrow($result))
2237 2664 psotfx
        {
2238 3737 ludovic_arnaud
                $topic_list[] = $row['topic_id'];
2239 3737 ludovic_arnaud
        }
2240 3737 ludovic_arnaud
        $db->sql_freeresult($result);
2241 2664 psotfx
2242 6364 acydburn
        if ($prune_flags & FORUM_FLAG_PRUNE_POLL)
2243 3989 psotfx
        {
2244 3989 psotfx
                $sql = 'SELECT topic_id
2245 6271 acydburn
                        FROM ' . TOPICS_TABLE . '
2246 6271 acydburn
                        WHERE ' . $db->sql_in_set('forum_id', $forum_id) . "
2247 8146 acydburn
                                AND poll_start > 0
2248 8146 acydburn
                                AND poll_last_vote < $prune_date
2249 3989 psotfx
                                $sql_and";
2250 3989 psotfx
                $result = $db->sql_query($sql);
2251 3989 psotfx
2252 3989 psotfx
                while ($row = $db->sql_fetchrow($result))
2253 3989 psotfx
                {
2254 3989 psotfx
                        $topic_list[] = $row['topic_id'];
2255 3989 psotfx
                }
2256 3989 psotfx
                $db->sql_freeresult($result);
2257 3989 psotfx
2258 3989 psotfx
                $topic_list = array_unique($topic_list);
2259 3989 psotfx
        }
2260 3989 psotfx
2261 6974 naderman
        return delete_topics('topic_id', $topic_list, $auto_sync, false);
2262 3737 ludovic_arnaud
}
2263 2664 psotfx
2264 5114 acydburn
/**
2265 5114 acydburn
* Function auto_prune(), this function now relies on passed vars
2266 5114 acydburn
*/
2267 4482 acydburn
function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_freq)
2268 3737 ludovic_arnaud
{
2269 3989 psotfx
        global $db;
2270 3989 psotfx
2271 3992 psotfx
        $sql = 'SELECT forum_name
2272 3992 psotfx
                FROM ' . FORUMS_TABLE . "
2273 3992 psotfx
                WHERE forum_id = $forum_id";
2274 6009 naderman
        $result = $db->sql_query($sql, 3600);
2275 6015 acydburn
        $row = $db->sql_fetchrow($result);
2276 6015 acydburn
        $db->sql_freeresult($result);
2277 2664 psotfx
2278 6015 acydburn
        if ($row)
2279 3992 psotfx
        {
2280 3992 psotfx
                $prune_date = time() - ($prune_days * 86400);
2281 3992 psotfx
                $next_prune = time() + ($prune_freq * 86400);
2282 3737 ludovic_arnaud
2283 4482 acydburn
                prune($forum_id, $prune_mode, $prune_date, $prune_flags, true);
2284 3737 ludovic_arnaud
2285 3992 psotfx
                $sql = 'UPDATE ' . FORUMS_TABLE . "
2286 3992 psotfx
                        SET prune_next = $next_prune
2287 3992 psotfx
                        WHERE forum_id = $forum_id";
2288 3992 psotfx
                $db->sql_query($sql);
2289 3992 psotfx
2290 3992 psotfx
                add_log('admin', 'LOG_AUTO_PRUNE', $row['forum_name']);
2291 3992 psotfx
        }
2292 3992 psotfx
2293 2664 psotfx
        return;
2294 2664 psotfx
}
2295 2664 psotfx
2296 5114 acydburn
/**
2297 5114 acydburn
* Cache moderators, called whenever permissions are changed via admin_permissions. Changes of username
2298 5114 acydburn
* and group names must be carried through for the moderators table
2299 5114 acydburn
*/
2300 3064 psotfx
function cache_moderators()
2301 3061 psotfx
{
2302 5603 acydburn
        global $db, $cache, $auth, $phpbb_root_path, $phpEx;
2303 3061 psotfx
2304 6019 acydburn
        // Remove cached sql results
2305 6021 acydburn
        $cache->destroy('sql', MODERATOR_CACHE_TABLE);
2306 6019 acydburn
2307 3061 psotfx
        // Clear table
2308 6954 davidmj
        switch ($db->sql_layer)
2309 6954 davidmj
        {
2310 6954 davidmj
                case 'sqlite':
2311 6954 davidmj
                case 'firebird':
2312 6954 davidmj
                        $db->sql_query('DELETE FROM ' . MODERATOR_CACHE_TABLE);
2313 6954 davidmj
                break;
2314 3061 psotfx
2315 6954 davidmj
                default:
2316 6954 davidmj
                        $db->sql_query('TRUNCATE TABLE ' . MODERATOR_CACHE_TABLE);
2317 6954 davidmj
                break;
2318 6954 davidmj
        }
2319 6954 davidmj
2320 6115 acydburn
        // We add moderators who have forum moderator permissions without an explicit ACL_NEVER setting
2321 5603 acydburn
        $hold_ary = $ug_id_ary = $sql_ary = array();
2322 3061 psotfx
2323 5603 acydburn
        // Grab all users having moderative options...
2324 5603 acydburn
        $hold_ary = $auth->acl_user_raw_data(false, 'm_%', false);
2325 3061 psotfx
2326 5603 acydburn
        // Add users?
2327 5603 acydburn
        if (sizeof($hold_ary))
2328 3061 psotfx
        {
2329 5603 acydburn
                // At least one moderative option warrants a display
2330 5603 acydburn
                $ug_id_ary = array_keys($hold_ary);
2331 3061 psotfx
2332 5603 acydburn
                // Remove users who have group memberships with DENY moderator permissions
2333 5885 davidmj
                $sql = $db->sql_build_query('SELECT', array(
2334 9625 acydburn
                        'SELECT'        => 'a.forum_id, ug.user_id, g.group_id',
2335 5885 davidmj
2336 5885 davidmj
                        'FROM'                => array(
2337 5885 davidmj
                                ACL_OPTIONS_TABLE        => 'o',
2338 5885 davidmj
                                USER_GROUP_TABLE        => 'ug',
2339 10260 acydburn
                                GROUPS_TABLE                => 'g',
2340 9625 acydburn
                                ACL_GROUPS_TABLE        => 'a',
2341 5885 davidmj
                        ),
2342 5885 davidmj
2343 5885 davidmj
                        'LEFT_JOIN'        => array(
2344 5885 davidmj
                                array(
2345 5885 davidmj
                                        'FROM'        => array(ACL_ROLES_DATA_TABLE => 'r'),
2346 5885 davidmj
                                        'ON'        => 'a.auth_role_id = r.role_id'
2347 5885 davidmj
                                )
2348 5885 davidmj
                        ),
2349 5885 davidmj
2350 5885 davidmj
                        'WHERE'                => '(o.auth_option_id = a.auth_option_id OR o.auth_option_id = r.auth_option_id)
2351 6115 acydburn
                                AND ((a.auth_setting = ' . ACL_NEVER . ' AND r.auth_setting IS NULL)
2352 6115 acydburn
                                        OR r.auth_setting = ' . ACL_NEVER . ')
2353 6015 acydburn
                                AND a.group_id = ug.group_id
2354 9651 acydburn
                                AND g.group_id = ug.group_id
2355 9625 acydburn
                                AND NOT (ug.group_leader = 1 AND g.group_skip_auth = 1)
2356 6271 acydburn
                                AND ' . $db->sql_in_set('ug.user_id', $ug_id_ary) . "
2357 6081 acydburn
                                AND ug.user_pending = 0
2358 7789 acydburn
                                AND o.auth_option " . $db->sql_like_expression('m_' . $db->any_char),
2359 5885 davidmj
                ));
2360 3061 psotfx
                $result = $db->sql_query($sql);
2361 3061 psotfx
2362 3061 psotfx
                while ($row = $db->sql_fetchrow($result))
2363 3061 psotfx
                {
2364 5603 acydburn
                        if (isset($hold_ary[$row['user_id']][$row['forum_id']]))
2365 5603 acydburn
                        {
2366 5603 acydburn
                                unset($hold_ary[$row['user_id']][$row['forum_id']]);
2367 5603 acydburn
                        }
2368 3061 psotfx
                }
2369 3061 psotfx
                $db->sql_freeresult($result);
2370 5603 acydburn
2371 5603 acydburn
                if (sizeof($hold_ary))
2372 5603 acydburn
                {
2373 5603 acydburn
                        // Get usernames...
2374 5603 acydburn
                        $sql = 'SELECT user_id, username
2375 5603 acydburn
                                FROM ' . USERS_TABLE . '
2376 6271 acydburn
                                WHERE ' . $db->sql_in_set('user_id', array_keys($hold_ary));
2377 5603 acydburn
                        $result = $db->sql_query($sql);
2378 5603 acydburn
2379 5603 acydburn
                        $usernames_ary = array();
2380 5603 acydburn
                        while ($row = $db->sql_fetchrow($result))
2381 5603 acydburn
                        {
2382 5603 acydburn
                                $usernames_ary[$row['user_id']] = $row['username'];
2383 5603 acydburn
                        }
2384 5603 acydburn
2385 5603 acydburn
                        foreach ($hold_ary as $user_id => $forum_id_ary)
2386 5603 acydburn
                        {
2387 6511 acydburn
                                // Do not continue if user does not exist
2388 6511 acydburn
                                if (!isset($usernames_ary[$user_id]))
2389 6511 acydburn
                                {
2390 6511 acydburn
                                        continue;
2391 6511 acydburn
                                }
2392 6511 acydburn
2393 5603 acydburn
                                foreach ($forum_id_ary as $forum_id => $auth_ary)
2394 5603 acydburn
                                {
2395 5603 acydburn
                                        $sql_ary[] = array(
2396 7961 acydburn
                                                'forum_id'                => (int) $forum_id,
2397 7961 acydburn
                                                'user_id'                => (int) $user_id,
2398 7961 acydburn
                                                'username'                => (string) $usernames_ary[$user_id],
2399 5603 acydburn
                                                'group_id'                => 0,
2400 5784 acydburn
                                                'group_name'        => ''
2401 5603 acydburn
                                        );
2402 5603 acydburn
                                }
2403 5603 acydburn
                        }
2404 5603 acydburn
                }
2405 3061 psotfx
        }
2406 3061 psotfx
2407 5603 acydburn
        // Now to the groups...
2408 5603 acydburn
        $hold_ary = $auth->acl_group_raw_data(false, 'm_%', false);
2409 3061 psotfx
2410 5603 acydburn
        if (sizeof($hold_ary))
2411 3061 psotfx
        {
2412 5603 acydburn
                $ug_id_ary = array_keys($hold_ary);
2413 5603 acydburn
2414 5603 acydburn
                // Make sure not hidden or special groups are involved...
2415 5603 acydburn
                $sql = 'SELECT group_name, group_id, group_type
2416 6930 acydburn
                        FROM ' . GROUPS_TABLE . '
2417 6271 acydburn
                        WHERE ' . $db->sql_in_set('group_id', $ug_id_ary);
2418 5603 acydburn
                $result = $db->sql_query($sql);
2419 5603 acydburn
2420 5603 acydburn
                $groupnames_ary = array();
2421 5603 acydburn
                while ($row = $db->sql_fetchrow($result))
2422 5603 acydburn
                {
2423 5603 acydburn
                        if ($row['group_type'] == GROUP_HIDDEN || $row['group_type'] == GROUP_SPECIAL)
2424 5603 acydburn
                        {
2425 5603 acydburn
                                unset($hold_ary[$row['group_id']]);
2426 5603 acydburn
                        }
2427 5603 acydburn
2428 5603 acydburn
                        $groupnames_ary[$row['group_id']] = $row['group_name'];
2429 5603 acydburn
                }
2430 5603 acydburn
                $db->sql_freeresult($result);
2431 5603 acydburn
2432 5603 acydburn
                foreach ($hold_ary as $group_id => $forum_id_ary)
2433 5603 acydburn
                {
2434 6511 acydburn
                        // If there is no group, we do not assign it...
2435 6511 acydburn
                        if (!isset($groupnames_ary[$group_id]))
2436 6511 acydburn
                        {
2437 6511 acydburn
                                continue;
2438 6511 acydburn
                        }
2439 6511 acydburn
2440 5603 acydburn
                        foreach ($forum_id_ary as $forum_id => $auth_ary)
2441 5603 acydburn
                        {
2442 5870 acydburn
                                $flag = false;
2443 5870 acydburn
                                foreach ($auth_ary as $auth_option => $setting)
2444 5870 acydburn
                                {
2445 5870 acydburn
                                        // Make sure at least one ACL_YES option is set...
2446 5870 acydburn
                                        if ($setting == ACL_YES)
2447 5870 acydburn
                                        {
2448 5870 acydburn
                                                $flag = true;
2449 5870 acydburn
                                                break;
2450 5870 acydburn
                                        }
2451 5870 acydburn
                                }
2452 5870 acydburn
2453 5870 acydburn
                                if (!$flag)
2454 5870 acydburn
                                {
2455 5870 acydburn
                                        continue;
2456 5870 acydburn
                                }
2457 5870 acydburn
2458 5603 acydburn
                                $sql_ary[] = array(
2459 7961 acydburn
                                        'forum_id'                => (int) $forum_id,
2460 5603 acydburn
                                        'user_id'                => 0,
2461 5603 acydburn
                                        'username'                => '',
2462 7961 acydburn
                                        'group_id'                => (int) $group_id,
2463 7961 acydburn
                                        'group_name'        => (string) $groupnames_ary[$group_id]
2464 5603 acydburn
                                );
2465 5603 acydburn
                        }
2466 5603 acydburn
                }
2467 3061 psotfx
        }
2468 3061 psotfx
2469 6497 acydburn
        $db->sql_multi_insert(MODERATOR_CACHE_TABLE, $sql_ary);
2470 3061 psotfx
}
2471 3061 psotfx
2472 5114 acydburn
/**
2473 5114 acydburn
* View log
2474 10991 git-gate
* If $log_count is set to false, we will skip counting all entries in the database.
2475 5114 acydburn
*/
2476 10041 terrafrost
function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $limit_days = 0, $sort_by = 'l.log_time DESC', $keywords = '')
2477 3399 psotfx
{
2478 6015 acydburn
        global $db, $user, $auth, $phpEx, $phpbb_root_path, $phpbb_admin_path;
2479 3833 psotfx
2480 5848 acydburn
        $topic_id_list = $reportee_id_list = $is_auth = $is_mod = array();
2481 3833 psotfx
2482 6015 acydburn
        $profile_url = (defined('IN_ADMIN')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview') : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile');
2483 3399 psotfx
2484 4210 acydburn
        switch ($mode)
2485 3781 ludovic_arnaud
        {
2486 4210 acydburn
                case 'admin':
2487 4210 acydburn
                        $log_type = LOG_ADMIN;
2488 4210 acydburn
                        $sql_forum = '';
2489 5848 acydburn
                break;
2490 6015 acydburn
2491 4210 acydburn
                case 'mod':
2492 4210 acydburn
                        $log_type = LOG_MOD;
2493 10146 acydburn
                        $sql_forum = '';
2494 3399 psotfx
2495 4210 acydburn
                        if ($topic_id)
2496 4210 acydburn
                        {
2497 10112 bantu
                                $sql_forum = 'AND l.topic_id = ' . (int) $topic_id;
2498 4210 acydburn
                        }
2499 4210 acydburn
                        else if (is_array($forum_id))
2500 4210 acydburn
                        {
2501 6271 acydburn
                                $sql_forum = 'AND ' . $db->sql_in_set('l.forum_id', array_map('intval', $forum_id));
2502 4210 acydburn
                        }
2503 10112 bantu
                        else if ($forum_id)
2504 4210 acydburn
                        {
2505 10112 bantu
                                $sql_forum = 'AND l.forum_id = ' . (int) $forum_id;
2506 4210 acydburn
                        }
2507 5848 acydburn
                break;
2508 4824 psotfx
2509 4824 psotfx
                case 'user':
2510 4824 psotfx
                        $log_type = LOG_USERS;
2511 6650 acydburn
                        $sql_forum = 'AND l.reportee_id = ' . (int) $user_id;
2512 5848 acydburn
                break;
2513 8782 acydburn
2514 5848 acydburn
                case 'users':
2515 5848 acydburn
                        $log_type = LOG_USERS;
2516 5848 acydburn
                        $sql_forum = '';
2517 5848 acydburn
                break;
2518 5848 acydburn
2519 4210 acydburn
                case 'critical':
2520 4210 acydburn
                        $log_type = LOG_CRITICAL;
2521 4210 acydburn
                        $sql_forum = '';
2522 5848 acydburn
                break;
2523 8782 acydburn
2524 4210 acydburn
                default:
2525 4210 acydburn
                        return;
2526 3781 ludovic_arnaud
        }
2527 3781 ludovic_arnaud
2528 10240 acydburn
        // Use no preg_quote for $keywords because this would lead to sole backslashes being added
2529 10240 acydburn
        // We also use an OR connection here for spaces and the | string. Currently, regex is not supported for searching (but may come later).
2530 10240 acydburn
        $keywords = preg_split('#[\s|]+#u', utf8_strtolower($keywords), 0, PREG_SPLIT_NO_EMPTY);
2531 10041 terrafrost
        $sql_keywords = '';
2532 10041 terrafrost
2533 10041 terrafrost
        if (!empty($keywords))
2534 10041 terrafrost
        {
2535 10240 acydburn
                $keywords_pattern = array();
2536 10240 acydburn
2537 10240 acydburn
                // Build pattern and keywords...
2538 10041 terrafrost
                for ($i = 0, $num_keywords = sizeof($keywords); $i < $num_keywords; $i++)
2539 10041 terrafrost
                {
2540 10240 acydburn
                        $keywords_pattern[] = preg_quote($keywords[$i], '#');
2541 10041 terrafrost
                        $keywords[$i] = $db->sql_like_expression($db->any_char . $keywords[$i] . $db->any_char);
2542 10041 terrafrost
                }
2543 10041 terrafrost
2544 10240 acydburn
                $keywords_pattern = '#' . implode('|', $keywords_pattern) . '#ui';
2545 10240 acydburn
2546 10041 terrafrost
                $operations = array();
2547 10112 bantu
                foreach ($user->lang as $key => $value)
2548 10041 terrafrost
                {
2549 10041 terrafrost
                        if (substr($key, 0, 4) == 'LOG_' && preg_match($keywords_pattern, $value))
2550 10041 terrafrost
                        {
2551 10041 terrafrost
                                $operations[] = $key;
2552 10041 terrafrost
                        }
2553 10041 terrafrost
                }
2554 10041 terrafrost
2555 10041 terrafrost
                $sql_keywords = 'AND (';
2556 10041 terrafrost
                if (!empty($operations))
2557 10041 terrafrost
                {
2558 10112 bantu
                        $sql_keywords .= $db->sql_in_set('l.log_operation', $operations) . ' OR ';
2559 10041 terrafrost
                }
2560 10112 bantu
                $sql_keywords .= 'LOWER(l.log_data) ' . implode(' OR LOWER(l.log_data) ', $keywords) . ')';
2561 10041 terrafrost
        }
2562 10041 terrafrost
2563 11301 git-gate
        if ($log_count !== false)
2564 11301 git-gate
        {
2565 11301 git-gate
                $sql = 'SELECT COUNT(l.log_id) AS total_entries
2566 11301 git-gate
                        FROM ' . LOG_TABLE . ' l, ' . USERS_TABLE . " u
2567 11301 git-gate
                        WHERE l.log_type = $log_type
2568 11301 git-gate
                                AND l.user_id = u.user_id
2569 11301 git-gate
                                AND l.log_time >= $limit_days
2570 11301 git-gate
                                $sql_keywords
2571 11301 git-gate
                                $sql_forum";
2572 11301 git-gate
                $result = $db->sql_query($sql);
2573 11301 git-gate
                $log_count = (int) $db->sql_fetchfield('total_entries');
2574 11301 git-gate
                $db->sql_freeresult($result);
2575 11301 git-gate
        }
2576 11301 git-gate
2577 11578 git-gate
        // $log_count may be false here if false was passed in for it,
2578 11578 git-gate
        // because in this case we did not run the COUNT() query above.
2579 11578 git-gate
        // If we ran the COUNT() query and it returned zero rows, return;
2580 11578 git-gate
        // otherwise query for logs below.
2581 11578 git-gate
        if ($log_count === 0)
2582 11301 git-gate
        {
2583 11301 git-gate
                // Save the queries, because there are no logs to display
2584 11301 git-gate
                return 0;
2585 11301 git-gate
        }
2586 11301 git-gate
2587 11301 git-gate
        if ($offset >= $log_count)
2588 11301 git-gate
        {
2589 11301 git-gate
                $offset = ($offset - $limit < 0) ? 0 : $offset - $limit;
2590 11301 git-gate
        }
2591 11301 git-gate
2592 6698 acydburn
        $sql = "SELECT l.*, u.username, u.username_clean, u.user_colour
2593 4210 acydburn
                FROM " . LOG_TABLE . " l, " . USERS_TABLE . " u
2594 4210 acydburn
                WHERE l.log_type = $log_type
2595 4210 acydburn
                        AND u.user_id = l.user_id
2596 10041 terrafrost
                        " . (($limit_days) ? "AND l.log_time >= $limit_days" : '') . "
2597 10041 terrafrost
                        $sql_keywords
2598 3833 psotfx
                        $sql_forum
2599 3781 ludovic_arnaud
                ORDER BY $sort_by";
2600 3781 ludovic_arnaud
        $result = $db->sql_query_limit($sql, $limit, $offset);
2601 3399 psotfx
2602 3781 ludovic_arnaud
        $i = 0;
2603 3399 psotfx
        $log = array();
2604 3781 ludovic_arnaud
        while ($row = $db->sql_fetchrow($result))
2605 3399 psotfx
        {
2606 3781 ludovic_arnaud
                if ($row['topic_id'])
2607 3399 psotfx
                {
2608 3781 ludovic_arnaud
                        $topic_id_list[] = $row['topic_id'];
2609 3781 ludovic_arnaud
                }
2610 3781 ludovic_arnaud
2611 5848 acydburn
                if ($row['reportee_id'])
2612 5848 acydburn
                {
2613 5848 acydburn
                        $reportee_id_list[] = $row['reportee_id'];
2614 5848 acydburn
                }
2615 3781 ludovic_arnaud
2616 5848 acydburn
                $log[$i] = array(
2617 6015 acydburn
                        'id'                                => $row['log_id'],
2618 6650 acydburn
2619 6650 acydburn
                        'reportee_id'                        => $row['reportee_id'],
2620 6650 acydburn
                        'reportee_username'                => '',
2621 6650 acydburn
                        'reportee_username_full'=> '',
2622 6650 acydburn
2623 5848 acydburn
                        'user_id'                        => $row['user_id'],
2624 6650 acydburn
                        'username'                        => $row['username'],
2625 6650 acydburn
                        'username_full'                => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, $profile_url),
2626 6650 acydburn
2627 5848 acydburn
                        'ip'                                => $row['log_ip'],
2628 5848 acydburn
                        'time'                                => $row['log_time'],
2629 5848 acydburn
                        'forum_id'                        => $row['forum_id'],
2630 5848 acydburn
                        'topic_id'                        => $row['topic_id'],
2631 6015 acydburn
2632 6055 acydburn
                        'viewforum'                        => ($row['forum_id'] && $auth->acl_get('f_read', $row['forum_id'])) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : false,
2633 5848 acydburn
                        'action'                        => (isset($user->lang[$row['log_operation']])) ? $user->lang[$row['log_operation']] : '{' . ucfirst(str_replace('_', ' ', $row['log_operation'])) . '}',
2634 5848 acydburn
                );
2635 5848 acydburn
2636 3781 ludovic_arnaud
                if (!empty($row['log_data']))
2637 3781 ludovic_arnaud
                {
2638 9589 toonarmy
                        $log_data_ary = @unserialize($row['log_data']);
2639 9589 toonarmy
                        $log_data_ary = ($log_data_ary === false) ? array() : $log_data_ary;
2640 3781 ludovic_arnaud
2641 5114 acydburn
                        if (isset($user->lang[$row['log_operation']]))
2642 3781 ludovic_arnaud
                        {
2643 8908 toonarmy
                                // Check if there are more occurrences of % than arguments, if there are we fill out the arguments array
2644 8908 toonarmy
                                // It doesn't matter if we add more arguments than placeholders
2645 9065 toonarmy
                                if ((substr_count($log[$i]['action'], '%') - sizeof($log_data_ary)) > 0)
2646 8908 toonarmy
                                {
2647 8908 toonarmy
                                        $log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($log[$i]['action'], '%') - sizeof($log_data_ary), ''));
2648 8908 toonarmy
                                }
2649 7266 acydburn
2650 8908 toonarmy
                                $log[$i]['action'] = vsprintf($log[$i]['action'], $log_data_ary);
2651 8908 toonarmy
2652 7266 acydburn
                                // If within the admin panel we do not censor text out
2653 7266 acydburn
                                if (defined('IN_ADMIN'))
2654 7266 acydburn
                                {
2655 8050 naderman
                                        $log[$i]['action'] = bbcode_nl2br($log[$i]['action']);
2656 7266 acydburn
                                }
2657 7266 acydburn
                                else
2658 7266 acydburn
                                {
2659 8050 naderman
                                        $log[$i]['action'] = bbcode_nl2br(censor_text($log[$i]['action']));
2660 7266 acydburn
                                }
2661 3781 ludovic_arnaud
                        }
2662 9589 toonarmy
                        else if (!empty($log_data_ary))
2663 4210 acydburn
                        {
2664 5114 acydburn
                                $log[$i]['action'] .= '<br />' . implode('', $log_data_ary);
2665 4210 acydburn
                        }
2666 7491 acydburn
2667 7589 acydburn
                        /* Apply make_clickable... has to be seen if it is for good. :/
2668 7589 acydburn
                        // Seems to be not for the moment, reconsider later...
2669 7491 acydburn
                        $log[$i]['action'] = make_clickable($log[$i]['action']);
2670 7589 acydburn
                        */
2671 3781 ludovic_arnaud
                }
2672 3399 psotfx
2673 3781 ludovic_arnaud
                $i++;
2674 3781 ludovic_arnaud
        }
2675 3781 ludovic_arnaud
        $db->sql_freeresult($result);
2676 3399 psotfx
2677 5033 acydburn
        if (sizeof($topic_id_list))
2678 3781 ludovic_arnaud
        {
2679 3800 ludovic_arnaud
                $topic_id_list = array_unique($topic_id_list);
2680 3800 ludovic_arnaud
2681 8146 acydburn
                // This query is not really needed if move_topics() updates the forum_id field,
2682 6015 acydburn
                // although it's also used to determine if the topic still exists in the database
2683 3781 ludovic_arnaud
                $sql = 'SELECT topic_id, forum_id
2684 3781 ludovic_arnaud
                        FROM ' . TOPICS_TABLE . '
2685 6271 acydburn
                        WHERE ' . $db->sql_in_set('topic_id', array_map('intval', $topic_id_list));
2686 3781 ludovic_arnaud
                $result = $db->sql_query($sql);
2687 3833 psotfx
2688 6015 acydburn
                $default_forum_id = 0;
2689 6015 acydburn
2690 3781 ludovic_arnaud
                while ($row = $db->sql_fetchrow($result))
2691 3781 ludovic_arnaud
                {
2692 6015 acydburn
                        if (!$row['forum_id'])
2693 3399 psotfx
                        {
2694 6015 acydburn
                                if ($auth->acl_getf_global('f_read'))
2695 6015 acydburn
                                {
2696 6015 acydburn
                                        if (!$default_forum_id)
2697 6015 acydburn
                                        {
2698 6015 acydburn
                                                $sql = 'SELECT forum_id
2699 6015 acydburn
                                                        FROM ' . FORUMS_TABLE . '
2700 6015 acydburn
                                                        WHERE forum_type = ' . FORUM_POST;
2701 6015 acydburn
                                                $f_result = $db->sql_query_limit($sql, 1);
2702 6015 acydburn
                                                $default_forum_id = (int) $db->sql_fetchfield('forum_id', false, $f_result);
2703 6015 acydburn
                                                $db->sql_freeresult($f_result);
2704 6015 acydburn
                                        }
2705 6015 acydburn
2706 6015 acydburn
                                        $is_auth[$row['topic_id']] = $default_forum_id;
2707 6015 acydburn
                                }
2708 3781 ludovic_arnaud
                        }
2709 6015 acydburn
                        else
2710 6015 acydburn
                        {
2711 6015 acydburn
                                if ($auth->acl_get('f_read', $row['forum_id']))
2712 6015 acydburn
                                {
2713 6015 acydburn
                                        $is_auth[$row['topic_id']] = $row['forum_id'];
2714 6015 acydburn
                                }
2715 6015 acydburn
                        }
2716 3399 psotfx
2717 3833 psotfx
                        if ($auth->acl_gets('a_', 'm_', $row['forum_id']))
2718 3781 ludovic_arnaud
                        {
2719 3781 ludovic_arnaud
                                $is_mod[$row['topic_id']] = $row['forum_id'];
2720 3399 psotfx
                        }
2721 3781 ludovic_arnaud
                }
2722 6015 acydburn
                $db->sql_freeresult($result);
2723 3399 psotfx
2724 3781 ludovic_arnaud
                foreach ($log as $key => $row)
2725 3781 ludovic_arnaud
                {
2726 6055 acydburn
                        $log[$key]['viewtopic'] = (isset($is_auth[$row['topic_id']])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $is_auth[$row['topic_id']] . '&amp;t=' . $row['topic_id']) : false;
2727 6055 acydburn
                        $log[$key]['viewlogs'] = (isset($is_mod[$row['topic_id']])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=logs&amp;mode=topic_logs&amp;t=' . $row['topic_id'], true, $user->session_id) : false;
2728 3399 psotfx
                }
2729 3399 psotfx
        }
2730 3399 psotfx
2731 6650 acydburn
        if (sizeof($reportee_id_list))
2732 5848 acydburn
        {
2733 5848 acydburn
                $reportee_id_list = array_unique($reportee_id_list);
2734 5848 acydburn
                $reportee_names_list = array();
2735 5848 acydburn
2736 6650 acydburn
                $sql = 'SELECT user_id, username, user_colour
2737 6650 acydburn
                        FROM ' . USERS_TABLE . '
2738 6650 acydburn
                        WHERE ' . $db->sql_in_set('user_id', $reportee_id_list);
2739 6650 acydburn
                $result = $db->sql_query($sql);
2740 6650 acydburn
2741 6650 acydburn
                while ($row = $db->sql_fetchrow($result))
2742 5848 acydburn
                {
2743 6650 acydburn
                        $reportee_names_list[$row['user_id']] = $row;
2744 5848 acydburn
                }
2745 6650 acydburn
                $db->sql_freeresult($result);
2746 5848 acydburn
2747 5848 acydburn
                foreach ($log as $key => $row)
2748 5848 acydburn
                {
2749 6650 acydburn
                        if (!isset($reportee_names_list[$row['reportee_id']]))
2750 6650 acydburn
                        {
2751 6650 acydburn
                                continue;
2752 6650 acydburn
                        }
2753 6650 acydburn
2754 6650 acydburn
                        $log[$key]['reportee_username'] = $reportee_names_list[$row['reportee_id']]['username'];
2755 6650 acydburn
                        $log[$key]['reportee_username_full'] = get_username_string('full', $row['reportee_id'], $reportee_names_list[$row['reportee_id']]['username'], $reportee_names_list[$row['reportee_id']]['user_colour'], false, $profile_url);
2756 5848 acydburn
                }
2757 5848 acydburn
        }
2758 5848 acydburn
2759 11301 git-gate
        return $offset;
2760 3399 psotfx
}
2761 3399 psotfx
2762 5329 grahamje
/**
2763 6366 acydburn
* Update foes - remove moderators and administrators from foe lists...
2764 6366 acydburn
*/
2765 7109 davidmj
function update_foes($group_id = false, $user_id = false)
2766 6366 acydburn
{
2767 6366 acydburn
        global $db, $auth;
2768 6366 acydburn
2769 7109 davidmj
        // update foes for some user
2770 7109 davidmj
        if (is_array($user_id) && sizeof($user_id))
2771 7109 davidmj
        {
2772 8146 acydburn
                $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
2773 7109 davidmj
                        WHERE ' . $db->sql_in_set('zebra_id', $user_id) . '
2774 7109 davidmj
                                AND foe = 1';
2775 7109 davidmj
                $db->sql_query($sql);
2776 7109 davidmj
                return;
2777 7109 davidmj
        }
2778 7109 davidmj
2779 7109 davidmj
        // update foes for some group
2780 7109 davidmj
        if (is_array($group_id) && sizeof($group_id))
2781 7109 davidmj
        {
2782 8146 acydburn
                // Grab group settings...
2783 7109 davidmj
                $sql = $db->sql_build_query('SELECT', array(
2784 7109 davidmj
                        'SELECT'        => 'a.group_id',
2785 7109 davidmj
2786 7109 davidmj
                        'FROM'                => array(
2787 7109 davidmj
                                ACL_OPTIONS_TABLE        => 'ao',
2788 7109 davidmj
                                ACL_GROUPS_TABLE        => 'a'
2789 7109 davidmj
                        ),
2790 7109 davidmj
2791 7109 davidmj
                        'LEFT_JOIN'        => array(
2792 7109 davidmj
                                array(
2793 7109 davidmj
                                        'FROM'        => array(ACL_ROLES_DATA_TABLE => 'r'),
2794 7109 davidmj
                                        'ON'        => 'a.auth_role_id = r.role_id'
2795 7109 davidmj
                                ),
2796 7109 davidmj
                        ),
2797 7109 davidmj
2798 7109 davidmj
                        'WHERE'                => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
2799 7109 davidmj
                                AND ' . $db->sql_in_set('a.group_id', $group_id) . "
2800 7109 davidmj
                                AND ao.auth_option IN ('a_', 'm_')",
2801 7109 davidmj
2802 7109 davidmj
                        'GROUP_BY'        => 'a.group_id'
2803 7109 davidmj
                ));
2804 7109 davidmj
                $result = $db->sql_query($sql);
2805 7109 davidmj
2806 7109 davidmj
                $groups = array();
2807 7109 davidmj
                while ($row = $db->sql_fetchrow($result))
2808 7109 davidmj
                {
2809 7109 davidmj
                        $groups[] = (int) $row['group_id'];
2810 7109 davidmj
                }
2811 7109 davidmj
                $db->sql_freeresult($result);
2812 7109 davidmj
2813 7109 davidmj
                if (!sizeof($groups))
2814 7109 davidmj
                {
2815 7109 davidmj
                        return;
2816 7109 davidmj
                }
2817 7109 davidmj
2818 7109 davidmj
                switch ($db->sql_layer)
2819 7109 davidmj
                {
2820 7109 davidmj
                        case 'mysqli':
2821 7109 davidmj
                        case 'mysql4':
2822 8814 acydburn
                                $sql = 'DELETE ' . (($db->sql_layer === 'mysqli' || version_compare($db->sql_server_info(true), '4.1', '>=')) ? 'z.*' : ZEBRA_TABLE) . '
2823 7109 davidmj
                                        FROM ' . ZEBRA_TABLE . ' z, ' . USER_GROUP_TABLE . ' ug
2824 7109 davidmj
                                        WHERE z.zebra_id = ug.user_id
2825 7109 davidmj
                                                AND z.foe = 1
2826 7109 davidmj
                                                AND ' . $db->sql_in_set('ug.group_id', $groups);
2827 7109 davidmj
                                $db->sql_query($sql);
2828 7109 davidmj
                        break;
2829 7109 davidmj
2830 7109 davidmj
                        default:
2831 7109 davidmj
                                $sql = 'SELECT user_id
2832 7109 davidmj
                                        FROM ' . USER_GROUP_TABLE . '
2833 7109 davidmj
                                        WHERE ' . $db->sql_in_set('group_id', $groups);
2834 7109 davidmj
                                $result = $db->sql_query($sql);
2835 7109 davidmj
2836 7109 davidmj
                                $users = array();
2837 7109 davidmj
                                while ($row = $db->sql_fetchrow($result))
2838 7109 davidmj
                                {
2839 7109 davidmj
                                        $users[] = (int) $row['user_id'];
2840 7109 davidmj
                                }
2841 7109 davidmj
                                $db->sql_freeresult($result);
2842 7109 davidmj
2843 7109 davidmj
                                if (sizeof($users))
2844 8782 acydburn
                                {
2845 8146 acydburn
                                        $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
2846 7109 davidmj
                                                WHERE ' . $db->sql_in_set('zebra_id', $users) . '
2847 7109 davidmj
                                                        AND foe = 1';
2848 7109 davidmj
                                        $db->sql_query($sql);
2849 7109 davidmj
                                }
2850 7109 davidmj
                        break;
2851 7109 davidmj
                }
2852 7109 davidmj
2853 7109 davidmj
                return;
2854 7109 davidmj
        }
2855 7109 davidmj
2856 7109 davidmj
        // update foes for everyone
2857 6366 acydburn
        $perms = array();
2858 6366 acydburn
        foreach ($auth->acl_get_list(false, array('a_', 'm_'), false) as $forum_id => $forum_ary)
2859 6366 acydburn
        {
2860 6366 acydburn
                foreach ($forum_ary as $auth_option => $user_ary)
2861 6366 acydburn
                {
2862 6366 acydburn
                        $perms = array_merge($perms, $user_ary);
2863 6366 acydburn
                }
2864 6366 acydburn
        }
2865 6366 acydburn
2866 6366 acydburn
        if (sizeof($perms))
2867 6366 acydburn
        {
2868 8146 acydburn
                $sql = 'DELETE FROM ' . ZEBRA_TABLE . '
2869 6366 acydburn
                        WHERE ' . $db->sql_in_set('zebra_id', array_unique($perms)) . '
2870 6366 acydburn
                                AND foe = 1';
2871 6366 acydburn
                $db->sql_query($sql);
2872 6366 acydburn
        }
2873 6366 acydburn
        unset($perms);
2874 6366 acydburn
}
2875 6366 acydburn
2876 6366 acydburn
/**
2877 6394 grahamje
* Lists inactive users
2878 6394 grahamje
*/
2879 6394 grahamje
function view_inactive_users(&$users, &$user_count, $limit = 0, $offset = 0, $limit_days = 0, $sort_by = 'user_inactive_time DESC')
2880 6394 grahamje
{
2881 6394 grahamje
        global $db, $user;
2882 6394 grahamje
2883 8239 acydburn
        $sql = 'SELECT COUNT(user_id) AS user_count
2884 8239 acydburn
                FROM ' . USERS_TABLE . '
2885 8239 acydburn
                WHERE user_type = ' . USER_INACTIVE .
2886 8239 acydburn
                (($limit_days) ? " AND user_inactive_time >= $limit_days" : '');
2887 8239 acydburn
        $result = $db->sql_query($sql);
2888 8239 acydburn
        $user_count = (int) $db->sql_fetchfield('user_count');
2889 8239 acydburn
        $db->sql_freeresult($result);
2890 8239 acydburn
2891 11301 git-gate
        if ($user_count == 0)
2892 11301 git-gate
        {
2893 11301 git-gate
                // Save the queries, because there are no users to display
2894 11301 git-gate
                return 0;
2895 11301 git-gate
        }
2896 11301 git-gate
2897 8239 acydburn
        if ($offset >= $user_count)
2898 8239 acydburn
        {
2899 8239 acydburn
                $offset = ($offset - $limit < 0) ? 0 : $offset - $limit;
2900 8239 acydburn
        }
2901 8239 acydburn
2902 9845 acydburn
        $sql = 'SELECT *
2903 8146 acydburn
                FROM ' . USERS_TABLE . '
2904 8146 acydburn
                WHERE user_type = ' . USER_INACTIVE .
2905 8146 acydburn
                (($limit_days) ? " AND user_inactive_time >= $limit_days" : '') . "
2906 6394 grahamje
                ORDER BY $sort_by";
2907 6394 grahamje
        $result = $db->sql_query_limit($sql, $limit, $offset);
2908 6394 grahamje
2909 6394 grahamje
        while ($row = $db->sql_fetchrow($result))
2910 6394 grahamje
        {
2911 6394 grahamje
                $row['inactive_reason'] = $user->lang['INACTIVE_REASON_UNKNOWN'];
2912 6394 grahamje
                switch ($row['user_inactive_reason'])
2913 6394 grahamje
                {
2914 6394 grahamje
                        case INACTIVE_REGISTER:
2915 6394 grahamje
                                $row['inactive_reason'] = $user->lang['INACTIVE_REASON_REGISTER'];
2916 6394 grahamje
                        break;
2917 6394 grahamje
2918 6394 grahamje
                        case INACTIVE_PROFILE:
2919 6394 grahamje
                                $row['inactive_reason'] = $user->lang['INACTIVE_REASON_PROFILE'];
2920 6394 grahamje
                        break;
2921 6394 grahamje
2922 6394 grahamje
                        case INACTIVE_MANUAL:
2923 6394 grahamje
                                $row['inactive_reason'] = $user->lang['INACTIVE_REASON_MANUAL'];
2924 6394 grahamje
                        break;
2925 6436 acydburn
2926 6436 acydburn
                        case INACTIVE_REMIND:
2927 6436 acydburn
                                $row['inactive_reason'] = $user->lang['INACTIVE_REASON_REMIND'];
2928 6436 acydburn
                        break;
2929 6394 grahamje
                }
2930 8782 acydburn
2931 6394 grahamje
                $users[] = $row;
2932 6394 grahamje
        }
2933 6394 grahamje
2934 8239 acydburn
        return $offset;
2935 6394 grahamje
}
2936 6394 grahamje
2937 6394 grahamje
/**
2938 5329 grahamje
* Lists warned users
2939 5329 grahamje
*/
2940 5333 grahamje
function view_warned_users(&$users, &$user_count, $limit = 0, $offset = 0, $limit_days = 0, $sort_by = 'user_warnings DESC')
2941 5329 grahamje
{
2942 5329 grahamje
        global $db;
2943 5329 grahamje
2944 6650 acydburn
        $sql = 'SELECT user_id, username, user_colour, user_warnings, user_last_warning
2945 5333 grahamje
                FROM ' . USERS_TABLE . '
2946 5329 grahamje
                WHERE user_warnings > 0
2947 5333 grahamje
                ' . (($limit_days) ? "AND user_last_warning >= $limit_days" : '') . "
2948 5333 grahamje
                ORDER BY $sort_by";
2949 5329 grahamje
        $result = $db->sql_query_limit($sql, $limit, $offset);
2950 5329 grahamje
        $users = $db->sql_fetchrowset($result);
2951 5329 grahamje
        $db->sql_freeresult($result);
2952 5329 grahamje
2953 5329 grahamje
        $sql = 'SELECT count(user_id) AS user_count
2954 5329 grahamje
                FROM ' . USERS_TABLE . '
2955 5333 grahamje
                WHERE user_warnings > 0
2956 5333 grahamje
                ' . (($limit_days) ? "AND user_last_warning >= $limit_days" : '');
2957 5329 grahamje
        $result = $db->sql_query($sql);
2958 6015 acydburn
        $user_count = (int) $db->sql_fetchfield('user_count');
2959 5329 grahamje
        $db->sql_freeresult($result);
2960 5329 grahamje
2961 5329 grahamje
        return;
2962 5329 grahamje
}
2963 5329 grahamje
2964 5114 acydburn
/**
2965 5302 acydburn
* Get database size
2966 5302 acydburn
* Currently only mysql and mssql are supported
2967 5302 acydburn
*/
2968 5302 acydburn
function get_database_size()
2969 5302 acydburn
{
2970 5302 acydburn
        global $db, $user, $table_prefix;
2971 6048 acydburn
2972 6048 acydburn
        $database_size = false;
2973 6048 acydburn
2974 6015 acydburn
        // This code is heavily influenced by a similar routine in phpMyAdmin 2.2.0
2975 6497 acydburn
        switch ($db->sql_layer)
2976 5302 acydburn
        {
2977 6042 davidmj
                case 'mysql':
2978 6042 davidmj
                case 'mysql4':
2979 6042 davidmj
                case 'mysqli':
2980 6042 davidmj
                        $sql = 'SELECT VERSION() AS mysql_version';
2981 6042 davidmj
                        $result = $db->sql_query($sql);
2982 6042 davidmj
                        $row = $db->sql_fetchrow($result);
2983 6042 davidmj
                        $db->sql_freeresult($result);
2984 5302 acydburn
2985 6042 davidmj
                        if ($row)
2986 5302 acydburn
                        {
2987 6042 davidmj
                                $version = $row['mysql_version'];
2988 5302 acydburn
2989 6042 davidmj
                                if (preg_match('#(3\.23|[45]\.)#', $version))
2990 6042 davidmj
                                {
2991 6042 davidmj
                                        $db_name = (preg_match('#^(?:3\.23\.(?:[6-9]|[1-9]{2}))|[45]\.#', $version)) ? "`{$db->dbname}`" : $db->dbname;
2992 5302 acydburn
2993 6042 davidmj
                                        $sql = 'SHOW TABLE STATUS
2994 6042 davidmj
                                                FROM ' . $db_name;
2995 8231 acydburn
                                        $result = $db->sql_query($sql, 7200);
2996 6042 davidmj
2997 6048 acydburn
                                        $database_size = 0;
2998 6042 davidmj
                                        while ($row = $db->sql_fetchrow($result))
2999 5302 acydburn
                                        {
3000 6042 davidmj
                                                if ((isset($row['Type']) && $row['Type'] != 'MRG_MyISAM') || (isset($row['Engine']) && ($row['Engine'] == 'MyISAM' || $row['Engine'] == 'InnoDB')))
3001 5302 acydburn
                                                {
3002 6042 davidmj
                                                        if ($table_prefix != '')
3003 5302 acydburn
                                                        {
3004 6549 davidmj
                                                                if (strpos($row['Name'], $table_prefix) !== false)
3005 6042 davidmj
                                                                {
3006 6048 acydburn
                                                                        $database_size += $row['Data_length'] + $row['Index_length'];
3007 6042 davidmj
                                                                }
3008 6042 davidmj
                                                        }
3009 6042 davidmj
                                                        else
3010 6042 davidmj
                                                        {
3011 6048 acydburn
                                                                $database_size += $row['Data_length'] + $row['Index_length'];
3012 5302 acydburn
                                                        }
3013 5302 acydburn
                                                }
3014 5302 acydburn
                                        }
3015 6042 davidmj
                                        $db->sql_freeresult($result);
3016 5302 acydburn
                                }
3017 6042 davidmj
                        }
3018 6042 davidmj
                break;
3019 6042 davidmj
3020 7965 davidmj
                case 'firebird':
3021 7965 davidmj
                        global $dbname;
3022 7965 davidmj
3023 7965 davidmj
                        // if it on the local machine, we can get lucky
3024 7965 davidmj
                        if (file_exists($dbname))
3025 7965 davidmj
                        {
3026 7965 davidmj
                                $database_size = filesize($dbname);
3027 7965 davidmj
                        }
3028 7965 davidmj
3029 7965 davidmj
                break;
3030 7965 davidmj
3031 7012 davidmj
                case 'sqlite':
3032 7011 davidmj
                        global $dbhost;
3033 7011 davidmj
3034 7011 davidmj
                        if (file_exists($dbhost))
3035 7011 davidmj
                        {
3036 7011 davidmj
                                $database_size = filesize($dbhost);
3037 7011 davidmj
                        }
3038 7011 davidmj
3039 7011 davidmj
                break;
3040 7011 davidmj
3041 7013 davidmj
                case 'mssql':
3042 7013 davidmj
                case 'mssql_odbc':
3043 10489 naderman
                case 'mssqlnative':
3044 6042 davidmj
                        $sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize
3045 6042 davidmj
                                FROM sysfiles';
3046 8231 acydburn
                        $result = $db->sql_query($sql, 7200);
3047 6048 acydburn
                        $database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false;
3048 6042 davidmj
                        $db->sql_freeresult($result);
3049 6042 davidmj
                break;
3050 6042 davidmj
3051 6042 davidmj
                case 'postgres':
3052 6042 davidmj
                        $sql = "SELECT proname
3053 6042 davidmj
                                FROM pg_proc
3054 6042 davidmj
                                WHERE proname = 'pg_database_size'";
3055 6042 davidmj
                        $result = $db->sql_query($sql);
3056 6042 davidmj
                        $row = $db->sql_fetchrow($result);
3057 6042 davidmj
                        $db->sql_freeresult($result);
3058 6042 davidmj
3059 6042 davidmj
                        if ($row['proname'] == 'pg_database_size')
3060 6042 davidmj
                        {
3061 7369 davidmj
                                $database = $db->dbname;
3062 7369 davidmj
                                if (strpos($database, '.') !== false)
3063 7369 davidmj
                                {
3064 7369 davidmj
                                        list($database, ) = explode('.', $database);
3065 7369 davidmj
                                }
3066 7369 davidmj
3067 6042 davidmj
                                $sql = "SELECT oid
3068 6042 davidmj
                                        FROM pg_database
3069 7369 davidmj
                                        WHERE datname = '$database'";
3070 6042 davidmj
                                $result = $db->sql_query($sql);
3071 6042 davidmj
                                $row = $db->sql_fetchrow($result);
3072 5302 acydburn
                                $db->sql_freeresult($result);
3073 6042 davidmj
3074 6042 davidmj
                                $oid = $row['oid'];
3075 6042 davidmj
3076 6042 davidmj
                                $sql = 'SELECT pg_database_size(' . $oid . ') as size';
3077 6042 davidmj
                                $result = $db->sql_query($sql);
3078 6042 davidmj
                                $row = $db->sql_fetchrow($result);
3079 6042 davidmj
                                $db->sql_freeresult($result);
3080 6042 davidmj
3081 6048 acydburn
                                $database_size = $row['size'];
3082 5302 acydburn
                        }
3083 6042 davidmj
                break;
3084 7721 davidmj
3085 7721 davidmj
                case 'oracle':
3086 7721 davidmj
                        $sql = 'SELECT SUM(bytes) as dbsize
3087 7721 davidmj
                                FROM user_segments';
3088 8231 acydburn
                        $result = $db->sql_query($sql, 7200);
3089 7721 davidmj
                        $database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false;
3090 7721 davidmj
                        $db->sql_freeresult($result);
3091 7721 davidmj
                break;
3092 5302 acydburn
        }
3093 5302 acydburn
3094 8389 acydburn
        $database_size = ($database_size !== false) ? get_formatted_filesize($database_size) : $user->lang['NOT_AVAILABLE'];
3095 5302 acydburn
3096 6048 acydburn
        return $database_size;
3097 5302 acydburn
}
3098 5302 acydburn
3099 5302 acydburn
/**
3100 5416 acydburn
* Retrieve contents from remotely stored file
3101 5416 acydburn
*/
3102 11468 git-gate
function get_remote_file($host, $directory, $filename, &$errstr, &$errno, $port = 80, $timeout = 6)
3103 5416 acydburn
{
3104 5416 acydburn
        global $user;
3105 5416 acydburn
3106 5416 acydburn
        if ($fsock = @fsockopen($host, $port, $errno, $errstr, $timeout))
3107 5416 acydburn
        {
3108 5416 acydburn
                @fputs($fsock, "GET $directory/$filename HTTP/1.1\r\n");
3109 5416 acydburn
                @fputs($fsock, "HOST: $host\r\n");
3110 5416 acydburn
                @fputs($fsock, "Connection: close\r\n\r\n");
3111 8782 acydburn
3112 11468 git-gate
                $timer_stop = time() + $timeout;
3113 11468 git-gate
                stream_set_timeout($fsock, $timeout);
3114 11468 git-gate
3115 5416 acydburn
                $file_info = '';
3116 5416 acydburn
                $get_info = false;
3117 5416 acydburn
3118 5416 acydburn
                while (!@feof($fsock))
3119 5416 acydburn
                {
3120 5416 acydburn
                        if ($get_info)
3121 5416 acydburn
                        {
3122 5416 acydburn
                                $file_info .= @fread($fsock, 1024);
3123 5416 acydburn
                        }
3124 5416 acydburn
                        else
3125 5416 acydburn
                        {
3126 5416 acydburn
                                $line = @fgets($fsock, 1024);
3127 5416 acydburn
                                if ($line == "\r\n")
3128 5416 acydburn
                                {
3129 5416 acydburn
                                        $get_info = true;
3130 5416 acydburn
                                }
3131 6846 acydburn
                                else if (stripos($line, '404 not found') !== false)
3132 5416 acydburn
                                {
3133 6312 acydburn
                                        $errstr = $user->lang['FILE_NOT_FOUND'] . ': ' . $filename;
3134 5416 acydburn
                                        return false;
3135 5416 acydburn
                                }
3136 5416 acydburn
                        }
3137 11468 git-gate
3138 11468 git-gate
                        $stream_meta_data = stream_get_meta_data($fsock);
3139 11468 git-gate
3140 11468 git-gate
                        if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop)
3141 11468 git-gate
                        {
3142 11468 git-gate
                                $errstr = $user->lang['FSOCK_TIMEOUT'];
3143 11468 git-gate
                                return false;
3144 11468 git-gate
                        }
3145 5416 acydburn
                }
3146 5416 acydburn
                @fclose($fsock);
3147 5416 acydburn
        }
3148 5416 acydburn
        else
3149 5416 acydburn
        {
3150 5416 acydburn
                if ($errstr)
3151 5416 acydburn
                {
3152 6850 acydburn
                        $errstr = utf8_convert_message($errstr);
3153 5416 acydburn
                        return false;
3154 5416 acydburn
                }
3155 5416 acydburn
                else
3156 5416 acydburn
                {
3157 6846 acydburn
                        $errstr = $user->lang['FSOCK_DISABLED'];
3158 5416 acydburn
                        return false;
3159 5416 acydburn
                }
3160 5416 acydburn
        }
3161 8782 acydburn
3162 5416 acydburn
        return $file_info;
3163 5416 acydburn
}
3164 5416 acydburn
3165 5416 acydburn
/**
3166 5602 grahamje
* Tidy Warnings
3167 5602 grahamje
* Remove all warnings which have now expired from the database
3168 5602 grahamje
* The duration of a warning can be defined by the administrator
3169 6915 acydburn
* This only removes the warning and reduces the associated count,
3170 5602 grahamje
* it does not remove the user note recording the contents of the warning
3171 5602 grahamje
*/
3172 5602 grahamje
function tidy_warnings()
3173 5602 grahamje
{
3174 5602 grahamje
        global $db, $config;
3175 5602 grahamje
3176 5602 grahamje
        $expire_date = time() - ($config['warnings_expire_days'] * 86400);
3177 5602 grahamje
        $warning_list = $user_list = array();
3178 5602 grahamje
3179 7027 davidmj
        $sql = 'SELECT * FROM ' . WARNINGS_TABLE . "
3180 7027 davidmj
                WHERE warning_time < $expire_date";
3181 5602 grahamje
        $result = $db->sql_query($sql);
3182 5602 grahamje
3183 5602 grahamje
        while ($row = $db->sql_fetchrow($result))
3184 5602 grahamje
        {
3185 5602 grahamje
                $warning_list[] = $row['warning_id'];
3186 7024 davidmj
                $user_list[$row['user_id']] = isset($user_list[$row['user_id']]) ? ++$user_list[$row['user_id']] : 1;
3187 5602 grahamje
        }
3188 5602 grahamje
        $db->sql_freeresult($result);
3189 5602 grahamje
3190 5602 grahamje
        if (sizeof($warning_list))
3191 5602 grahamje
        {
3192 5602 grahamje
                $db->sql_transaction('begin');
3193 5602 grahamje
3194 6271 acydburn
                $sql = 'DELETE FROM ' . WARNINGS_TABLE . '
3195 6271 acydburn
                        WHERE ' . $db->sql_in_set('warning_id', $warning_list);
3196 5602 grahamje
                $db->sql_query($sql);
3197 8782 acydburn
3198 5765 acydburn
                foreach ($user_list as $user_id => $value)
3199 5602 grahamje
                {
3200 5602 grahamje
                        $sql = 'UPDATE ' . USERS_TABLE . " SET user_warnings = user_warnings - $value
3201 5602 grahamje
                                WHERE user_id = $user_id";
3202 5602 grahamje
                        $db->sql_query($sql);
3203 5602 grahamje
                }
3204 5602 grahamje
3205 5602 grahamje
                $db->sql_transaction('commit');
3206 5602 grahamje
        }
3207 5602 grahamje
3208 5929 acydburn
        set_config('warnings_last_gc', time(), true);
3209 5602 grahamje
}
3210 5602 grahamje
3211 5602 grahamje
/**
3212 5929 acydburn
* Tidy database, doing some maintanance tasks
3213 5135 acydburn
*/
3214 5135 acydburn
function tidy_database()
3215 5135 acydburn
{
3216 5135 acydburn
        global $db;
3217 5135 acydburn
3218 8384 acydburn
        // Here we check permission consistency
3219 8384 acydburn
3220 8384 acydburn
        // Sometimes, it can happen permission tables having forums listed which do not exist
3221 8384 acydburn
        $sql = 'SELECT forum_id
3222 8384 acydburn
                FROM ' . FORUMS_TABLE;
3223 8384 acydburn
        $result = $db->sql_query($sql);
3224 8384 acydburn
3225 8384 acydburn
        $forum_ids = array(0);
3226 8384 acydburn
        while ($row = $db->sql_fetchrow($result))
3227 8384 acydburn
        {
3228 8384 acydburn
                $forum_ids[] = $row['forum_id'];
3229 8384 acydburn
        }
3230 8384 acydburn
        $db->sql_freeresult($result);
3231 8384 acydburn
3232 8384 acydburn
        // Delete those rows from the acl tables not having listed the forums above
3233 8384 acydburn
        $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
3234 8384 acydburn
                WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
3235 8384 acydburn
        $db->sql_query($sql);
3236 8384 acydburn
3237 8384 acydburn
        $sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
3238 8384 acydburn
                WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
3239 8384 acydburn
        $db->sql_query($sql);
3240 8384 acydburn
3241 6539 acydburn
        set_config('database_last_gc', time(), true);
3242 6539 acydburn
}
3243 6111 acydburn
3244 6539 acydburn
/**
3245 6539 acydburn
* Add permission language - this will make sure custom files will be included
3246 6539 acydburn
*/
3247 6539 acydburn
function add_permission_language()
3248 6539 acydburn
{
3249 6539 acydburn
        global $user, $phpEx;
3250 5135 acydburn
3251 7502 acydburn
        // First of all, our own file. We need to include it as the first file because it presets all relevant variables.
3252 7502 acydburn
        $user->add_lang('acp/permissions_phpbb');
3253 7502 acydburn
3254 6539 acydburn
        $files_to_add = array();
3255 6539 acydburn
3256 7502 acydburn
        // Now search in acp and mods folder for permissions_ files.
3257 6539 acydburn
        foreach (array('acp/', 'mods/') as $path)
3258 6539 acydburn
        {
3259 8782 acydburn
                $dh = @opendir($user->lang_path . $user->lang_name . '/' . $path);
3260 6539 acydburn
3261 6912 acydburn
                if ($dh)
3262 6539 acydburn
                {
3263 6539 acydburn
                        while (($file = readdir($dh)) !== false)
3264 6539 acydburn
                        {
3265 7502 acydburn
                                if ($file !== 'permissions_phpbb.' . $phpEx && strpos($file, 'permissions_') === 0 && substr($file, -(strlen($phpEx) + 1)) === '.' . $phpEx)
3266 6539 acydburn
                                {
3267 6539 acydburn
                                        $files_to_add[] = $path . substr($file, 0, -(strlen($phpEx) + 1));
3268 6539 acydburn
                                }
3269 6539 acydburn
                        }
3270 6539 acydburn
                        closedir($dh);
3271 6539 acydburn
                }
3272 6539 acydburn
        }
3273 6539 acydburn
3274 6539 acydburn
        if (!sizeof($files_to_add))
3275 6539 acydburn
        {
3276 6539 acydburn
                return false;
3277 6539 acydburn
        }
3278 6539 acydburn
3279 6539 acydburn
        $user->add_lang($files_to_add);
3280 6539 acydburn
        return true;
3281 5135 acydburn
}
3282 5135 acydburn
3283 9880 aptx
/**
3284 9880 aptx
 * Obtains the latest version information
3285 9880 aptx
 *
3286 9880 aptx
 * @param bool $force_update Ignores cached data. Defaults to false.
3287 9880 aptx
 * @param bool $warn_fail Trigger a warning if obtaining the latest version information fails. Defaults to false.
3288 9880 aptx
 * @param int $ttl Cache version information for $ttl seconds. Defaults to 86400 (24 hours).
3289 9880 aptx
 *
3290 9880 aptx
 * @return string | false Version info on success, false on failure.
3291 9880 aptx
 */
3292 9880 aptx
function obtain_latest_version_info($force_update = false, $warn_fail = false, $ttl = 86400)
3293 9880 aptx
{
3294 9880 aptx
        global $cache;
3295 9880 aptx
3296 9880 aptx
        $info = $cache->get('versioncheck');
3297 9880 aptx
3298 9880 aptx
        if ($info === false || $force_update)
3299 9880 aptx
        {
3300 9880 aptx
                $errstr = '';
3301 9880 aptx
                $errno = 0;
3302 9880 aptx
3303 10837 git-gate
                $info = get_remote_file('version.phpbb.com', '/phpbb',
3304 9880 aptx
                                ((defined('PHPBB_QA')) ? '30x_qa.txt' : '30x.txt'), $errstr, $errno);
3305 9880 aptx
3306 9880 aptx
                if ($info === false)
3307 9880 aptx
                {
3308 9880 aptx
                        $cache->destroy('versioncheck');
3309 9880 aptx
                        if ($warn_fail)
3310 9880 aptx
                        {
3311 9880 aptx
                                trigger_error($errstr, E_USER_WARNING);
3312 9880 aptx
                        }
3313 9880 aptx
                        return false;
3314 9880 aptx
                }
3315 9880 aptx
3316 9880 aptx
                $cache->put('versioncheck', $info, $ttl);
3317 9880 aptx
        }
3318 9880 aptx
3319 9880 aptx
        return $info;
3320 9880 aptx
}
3321 9880 aptx
3322 10491 bantu
/**
3323 10491 bantu
 * Enables a particular flag in a bitfield column of a given table.
3324 10491 bantu
 *
3325 10491 bantu
 * @param string        $table_name                The table to update
3326 10491 bantu
 * @param string        $column_name        The column containing a bitfield to update
3327 10491 bantu
 * @param int                $flag                        The binary flag which is OR-ed with the current column value
3328 10491 bantu
 * @param string        $sql_more                This string is attached to the sql query generated to update the table.
3329 10491 bantu
 *
3330 10491 bantu
 * @return void
3331 10491 bantu
 */
3332 10491 bantu
function enable_bitfield_column_flag($table_name, $column_name, $flag, $sql_more = '')
3333 10491 bantu
{
3334 10491 bantu
        global $db;
3335 10491 bantu
3336 10491 bantu
        $sql = 'UPDATE ' . $table_name . '
3337 10491 bantu
                SET ' . $column_name . ' = ' . $db->sql_bit_or($column_name, $flag) . '
3338 10491 bantu
                ' . $sql_more;
3339 10491 bantu
        $db->sql_query($sql);
3340 10491 bantu
}
3341 10491 bantu
3342 2286 psotfx
?>