aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/functions_admin.php82
1 files changed, 66 insertions, 16 deletions
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php
index cb830c18b7..5e02caefe1 100644
--- a/phpBB/includes/functions_admin.php
+++ b/phpBB/includes/functions_admin.php
@@ -652,9 +652,10 @@ function delete_attachments($post_id_array = -1, $attach_id_array = -1, $page =
// All-encompasing sync function
//
// Usage:
-// sync('topic', 'topic_id', 123); <= resynch topic #123
-// sync('topic', 'forum_id', array(2, 3)); <= resynch topics from forum #2 and #3
-// sync('topic'); <= resynch all topics
+// sync('topic', 'topic_id', 123); <= resync topic #123
+// sync('topic', 'forum_id', array(2, 3)); <= resync topics from forum #2 and #3
+// sync('topic'); <= resync all topics
+// sync('topic', 'range', 'topic_id BETWEEN 1 AND 60 <= resync a range of topics/forums (only available for 'topic' and 'forum' modes)
function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE, $sync_extra = FALSE)
{
global $db;
@@ -663,9 +664,9 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
{
$where_ids = array_unique($where_ids);
}
- else
+ elseif ($where_type != 'range')
{
- $where_ids = array($where_ids);
+ $where_ids = ($where_ids) ? array($where_ids) : array();
}
if ($mode == 'forum' || $mode == 'topic')
@@ -675,6 +676,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
$where_sql = '';
$where_sql_and = 'WHERE';
}
+ elseif ($where_type == 'range')
+ {
+ $where_sql = 'WHERE (' . $mode{0} . ".$where_ids)";
+ $where_sql_and = $where_sql . ' AND';
+ }
else
{
$where_sql = 'WHERE ' . $mode{0} . ".$where_type IN (" . implode(', ', $where_ids) . ')';
@@ -689,6 +695,42 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
switch ($mode)
{
+ case 'topic_moved':
+ switch (SQL_LAYER)
+ {
+ case 'mysql4':
+ $sql = 'DELETE FROM ' . TOPICS_TABLE . '
+ USING ' . TOPICS_TABLE . ' t1, ' . TOPICS_TABLE . " t2
+ WHERE t1.topic_moved_id = t2.topic_id
+ AND t1.forum_id = t2.forum_id";
+ $db->sql_query($sql);
+ break;
+
+ default:
+ $sql = 'SELECT t1.topic_id
+ FROM ' .TOPICS_TABLE . ' t1, ' . TOPICS_TABLE . " t2
+ WHERE t1.topic_moved_id = t2.topic_id
+ AND t1.forum_id = t2.forum_id";
+ $result = $db->sql_query($result);
+
+ if ($row = $db->sql_fetchrow($result))
+ {
+ $topic_id_ary = array();
+ do
+ {
+ $topic_id_ary[] = $row['topic_id'];
+ }
+ while ($row = $db->sql_fetchrow($result));
+
+ $sql = 'DELETE FROM ' . TOPICS_TABLE . '
+ WHERE topic_id IN (' . implode(', ', $topic_id_ary) . ')';
+ $db->sql_query($sql);
+ unset($topic_id_ary);
+ }
+ $db->sql_freeresult($result);
+ }
+ break;
+
case 'topic_approved':
$sql = 'SELECT t.topic_id, p.post_approved
FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
@@ -898,11 +940,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
$forum_ids[] = $row['forum_id'];
}
while ($row = $db->sql_fetchrow($result));
+ $db->sql_freeresult($result);
sync('forum', 'forum_id', $forum_ids, FALSE);
unset($forum_ids);
}
- $db->sql_freeresult($result);
return;
}
@@ -927,6 +969,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
$forum_data[$row['forum_id']] = $row;
$forum_data[$row['forum_id']]['posts'] = 0;
$forum_data[$row['forum_id']]['topics'] = 0;
+ $forum_data[$row['forum_id']]['topics_real'] = 0;
$forum_data[$row['forum_id']]['last_post_id'] = 0;
$forum_data[$row['forum_id']]['last_post_time'] = 0;
$forum_data[$row['forum_id']]['last_poster_id'] = 0;
@@ -1064,7 +1107,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
case 'topic':
$topic_data = $topic_ids = $post_ids = $approved_unapproved_ids = $resync_forums = array();
- $sql = 'SELECT t.*, p.post_approved, COUNT(p.post_id) AS total_posts, MIN(p.post_id) AS first_post_id, MAX(p.post_id) AS last_post_id
+ $sql = 'SELECT t.topic_id, t.forum_id, t.topic_approved, ' . (($sync_extra) ? 'topic_attachment, 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_last_post_id, t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_post_time, p.post_approved, COUNT(p.post_id) AS total_posts, MIN(p.post_id) AS first_post_id, MAX(p.post_id) AS last_post_id
FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
$where_sql_and p.topic_id = t.topic_id
GROUP BY p.topic_id, p.post_approved";
@@ -1099,7 +1142,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
}
}
}
- $db->sql_freeresult();
+ $db->sql_freeresult($result);
foreach ($topic_data as $topic_id => $row)
{
@@ -1134,9 +1177,9 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
// NOTE: if there are too many topics, the query can get too long and may crash the server
if (count($topic_ids) < 100)
{
- $sql = 'SELECT topic_id
- FROM ' . TOPICS_TABLE . "
- $where_sql_and topic_id NOT IN (" . implode(',', array_keys($topic_ids)) . ')';
+ $sql = 'SELECT t.topic_id
+ FROM ' . TOPICS_TABLE . " t
+ $where_sql_and t.topic_id NOT IN (" . implode(',', array_keys($topic_ids)) . ')';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -1146,8 +1189,8 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
}
else
{
- $sql = 'SELECT topic_id
- FROM ' . TOPICS_TABLE . "
+ $sql = 'SELECT t.topic_id
+ FROM ' . TOPICS_TABLE . " t
$where_sql";
$result = $db->sql_query($sql);
@@ -1159,13 +1202,14 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
}
}
}
- $db->sql_freeresult();
+ $db->sql_freeresult($result);
}
unset($topic_ids);
if (count($delete_ids))
{
delete_topics('topic_id', $delete_ids);
+ unset($delete_ids);
}
}
@@ -1174,6 +1218,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
return;
}
+ // NOTE: too many post_ids = crash the server...
$sql = 'SELECT p.post_id, p.topic_id, p.post_approved, p.poster_id, p.post_username, p.post_time, u.username
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
WHERE p.post_id IN (' . implode(', ', $post_ids) . ')
@@ -1203,7 +1248,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
$topic_data[$row['topic_id']]['last_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'];
}
}
- $db->sql_freeresult();
+ $db->sql_freeresult($result);
// approved becomes unapproved, and vice-versa
if (count($approved_unapproved_ids))
@@ -1213,6 +1258,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
WHERE topic_id IN (' . implode(', ', $approved_unapproved_ids) . ')';
$db->sql_query($sql);
}
+ unset($approved_unapproved_ids);
// These are field that will be synchronised
$fieldnames = array('time', 'replies', 'replies_real', 'poster', 'first_post_id', 'first_poster_name', 'last_post_id', 'last_post_time', 'last_poster_id', 'last_poster_name');
@@ -1305,11 +1351,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
$forum_ids[] = $row['forum_id'];
}
while ($row = $db->sql_fetchrow($result));
+ $db->sql_freeresult($result);
sync('forum', 'forum_id', $forum_ids, FALSE);
unset($forum_ids);
}
- $db->sql_freeresult($result);
}
break;
}
@@ -1457,6 +1503,10 @@ function remove_comments(&$output)
// remove_remarks will strip the sql comment lines out of an uploaded sql file
function remove_remarks($sql)
{
+ // NOTE: isn't this function actually doing
+ return preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*/', "\n", $sql));
+ // ?
+
$lines = explode("\n", $sql);
// try to keep mem. use down