mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 14:18:52 +00:00
Added: ability to sync() a range of id's
Changed: resource ID passed to sql_freeresult(), moved up some unset() calls git-svn-id: file:///svn/phpbb/trunk@4507 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
parent
84caf42728
commit
57f8f26999
1 changed files with 66 additions and 16 deletions
|
@ -652,9 +652,10 @@ function delete_attachments($post_id_array = -1, $attach_id_array = -1, $page =
|
||||||
// All-encompasing sync function
|
// All-encompasing sync function
|
||||||
//
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
// sync('topic', 'topic_id', 123); <= resynch topic #123
|
// sync('topic', 'topic_id', 123); <= resync topic #123
|
||||||
// sync('topic', 'forum_id', array(2, 3)); <= resynch topics from forum #2 and #3
|
// sync('topic', 'forum_id', array(2, 3)); <= resync topics from forum #2 and #3
|
||||||
// sync('topic'); <= resynch all topics
|
// 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)
|
function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE, $sync_extra = FALSE)
|
||||||
{
|
{
|
||||||
global $db;
|
global $db;
|
||||||
|
@ -663,9 +664,9 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
|
||||||
{
|
{
|
||||||
$where_ids = array_unique($where_ids);
|
$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')
|
if ($mode == 'forum' || $mode == 'topic')
|
||||||
|
@ -675,6 +676,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
|
||||||
$where_sql = '';
|
$where_sql = '';
|
||||||
$where_sql_and = 'WHERE';
|
$where_sql_and = 'WHERE';
|
||||||
}
|
}
|
||||||
|
elseif ($where_type == 'range')
|
||||||
|
{
|
||||||
|
$where_sql = 'WHERE (' . $mode{0} . ".$where_ids)";
|
||||||
|
$where_sql_and = $where_sql . ' AND';
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$where_sql = 'WHERE ' . $mode{0} . ".$where_type IN (" . implode(', ', $where_ids) . ')';
|
$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)
|
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':
|
case 'topic_approved':
|
||||||
$sql = 'SELECT t.topic_id, p.post_approved
|
$sql = 'SELECT t.topic_id, p.post_approved
|
||||||
FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
|
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'];
|
$forum_ids[] = $row['forum_id'];
|
||||||
}
|
}
|
||||||
while ($row = $db->sql_fetchrow($result));
|
while ($row = $db->sql_fetchrow($result));
|
||||||
|
$db->sql_freeresult($result);
|
||||||
|
|
||||||
sync('forum', 'forum_id', $forum_ids, FALSE);
|
sync('forum', 'forum_id', $forum_ids, FALSE);
|
||||||
unset($forum_ids);
|
unset($forum_ids);
|
||||||
}
|
}
|
||||||
$db->sql_freeresult($result);
|
|
||||||
|
|
||||||
return;
|
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']] = $row;
|
||||||
$forum_data[$row['forum_id']]['posts'] = 0;
|
$forum_data[$row['forum_id']]['posts'] = 0;
|
||||||
$forum_data[$row['forum_id']]['topics'] = 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_id'] = 0;
|
||||||
$forum_data[$row['forum_id']]['last_post_time'] = 0;
|
$forum_data[$row['forum_id']]['last_post_time'] = 0;
|
||||||
$forum_data[$row['forum_id']]['last_poster_id'] = 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':
|
case 'topic':
|
||||||
$topic_data = $topic_ids = $post_ids = $approved_unapproved_ids = $resync_forums = array();
|
$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
|
FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
|
||||||
$where_sql_and p.topic_id = t.topic_id
|
$where_sql_and p.topic_id = t.topic_id
|
||||||
GROUP BY p.topic_id, p.post_approved";
|
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)
|
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
|
// NOTE: if there are too many topics, the query can get too long and may crash the server
|
||||||
if (count($topic_ids) < 100)
|
if (count($topic_ids) < 100)
|
||||||
{
|
{
|
||||||
$sql = 'SELECT topic_id
|
$sql = 'SELECT t.topic_id
|
||||||
FROM ' . TOPICS_TABLE . "
|
FROM ' . TOPICS_TABLE . " t
|
||||||
$where_sql_and topic_id NOT IN (" . implode(',', array_keys($topic_ids)) . ')';
|
$where_sql_and t.topic_id NOT IN (" . implode(',', array_keys($topic_ids)) . ')';
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
|
||||||
while ($row = $db->sql_fetchrow($result))
|
while ($row = $db->sql_fetchrow($result))
|
||||||
|
@ -1146,8 +1189,8 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = FALSE,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$sql = 'SELECT topic_id
|
$sql = 'SELECT t.topic_id
|
||||||
FROM ' . TOPICS_TABLE . "
|
FROM ' . TOPICS_TABLE . " t
|
||||||
$where_sql";
|
$where_sql";
|
||||||
$result = $db->sql_query($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);
|
unset($topic_ids);
|
||||||
if (count($delete_ids))
|
if (count($delete_ids))
|
||||||
{
|
{
|
||||||
delete_topics('topic_id', $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;
|
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
|
$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
|
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
|
||||||
WHERE p.post_id IN (' . implode(', ', $post_ids) . ')
|
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'];
|
$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
|
// approved becomes unapproved, and vice-versa
|
||||||
if (count($approved_unapproved_ids))
|
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) . ')';
|
WHERE topic_id IN (' . implode(', ', $approved_unapproved_ids) . ')';
|
||||||
$db->sql_query($sql);
|
$db->sql_query($sql);
|
||||||
}
|
}
|
||||||
|
unset($approved_unapproved_ids);
|
||||||
|
|
||||||
// These are field that will be synchronised
|
// 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');
|
$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'];
|
$forum_ids[] = $row['forum_id'];
|
||||||
}
|
}
|
||||||
while ($row = $db->sql_fetchrow($result));
|
while ($row = $db->sql_fetchrow($result));
|
||||||
|
$db->sql_freeresult($result);
|
||||||
|
|
||||||
sync('forum', 'forum_id', $forum_ids, FALSE);
|
sync('forum', 'forum_id', $forum_ids, FALSE);
|
||||||
unset($forum_ids);
|
unset($forum_ids);
|
||||||
}
|
}
|
||||||
$db->sql_freeresult($result);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1457,6 +1503,10 @@ function remove_comments(&$output)
|
||||||
// remove_remarks will strip the sql comment lines out of an uploaded sql file
|
// remove_remarks will strip the sql comment lines out of an uploaded sql file
|
||||||
function remove_remarks($sql)
|
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);
|
$lines = explode("\n", $sql);
|
||||||
|
|
||||||
// try to keep mem. use down
|
// try to keep mem. use down
|
||||||
|
|
Loading…
Add table
Reference in a new issue