Skip to content

Commit

Permalink
WIP #31 Counters are wrong
Browse files Browse the repository at this point in the history
Split "counters_cleanup" into multiple functions to make it easier to follow
  • Loading branch information
JN-Jones committed Jun 16, 2015
1 parent 01ddbd7 commit 8749ddf
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 90 deletions.
1 change: 1 addition & 0 deletions index.php
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,7 @@
echo "<br /><br />\n{$lang->please_wait} <meta http-equiv=\"refresh\" content=\"2; url=index.php?action=completed\">";
exit;
}
// TODO: theoretically we don't need this and can simply redirect back to index.php here as the "module" part hasn't been removed yet
elseif($import_session['counters_cleanup'])
{
$debug->log->event("Show the counters cleanup page");
Expand Down
198 changes: 108 additions & 90 deletions resources/modules/posts.php
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public function insert($data)
*/
public function counters_cleanup()
{
global $db, $output, $import_session, $lang;
global $output, $lang;

$output->print_header($lang->module_post_rebuilding);

Expand All @@ -113,124 +113,142 @@ public function counters_cleanup()
flush();

// Rebuild thread counters, forum counters, user post counters, last post* and thread username
$this->rebuild_thread_counters();
$this->rebuild_forum_counters();
$this->rebuild_user_counters();
}

private function rebuild_thread_counters()
{
global $db, $output, $import_session, $lang;

$query = $db->simple_select("threads", "COUNT(*) as count", "import_tid != 0");
$num_imported_threads = $db->fetch_field($query, "count");
$last_percent = 0;

if($import_session['counters_cleanup_start'] < $num_imported_threads)
{
$this->debug->log->trace1("Rebuilding thread counters");

$progress = $import_session['counters_cleanup_start'];
$query = $db->simple_select("threads", "tid", "import_tid != 0", array('order_by' => 'tid', 'order_dir' => 'asc', 'limit_start' => intval($import_session['counters_cleanup_start']), 'limit' => 1000));
while($thread = $db->fetch_array($query))
{
rebuild_thread_counters($thread['tid']);
if($import_session['counters_cleanup_start'] >= $num_imported_threads) {
return;
}

++$progress;
$this->debug->log->trace1("Rebuilding thread counters");

if(($progress % 5) == 0)
{
if(($progress % 100) == 0)
{
check_memory();
}
$percent = round(($progress/$num_imported_threads)*100, 1);
if($percent != $last_percent)
{
$output->update_progress_bar($percent, $lang->sprintf($lang->module_post_thread_counter, $thread['tid']));
}
$last_percent = $percent;
}
}
$progress = $import_session['counters_cleanup_start'];
$query = $db->simple_select("threads", "tid", "import_tid != 0", array('order_by' => 'tid', 'order_dir' => 'asc', 'limit_start' => intval($import_session['counters_cleanup_start']), 'limit' => 1000));
while($thread = $db->fetch_array($query))
{
rebuild_thread_counters($thread['tid']);

$import_session['counters_cleanup_start'] += $progress;
++$progress;

if($import_session['counters_cleanup_start'] >= $num_imported_threads)
if(($progress % 5) == 0)
{
$this->debug->log->trace1("Finished rebuilding thread counters");
$import_session['counters_cleanup'] = 0;
echo $lang->done;
flush();
return;
if(($progress % 100) == 0)
{
check_memory();
}
$percent = round(($progress/$num_imported_threads)*100, 1);
if($percent != $last_percent)
{
$output->update_progress_bar($percent, $lang->sprintf($lang->module_post_thread_counter, $thread['tid']));
}
$last_percent = $percent;
}
$import_session['counters_cleanup'] = 1;
return;
}

$import_session['counters_cleanup_start'] += $progress;

if($import_session['counters_cleanup_start'] >= $num_imported_threads)
{
$this->debug->log->trace1("Rebuilding forum counters");
echo "{$lang->done}. <br />{$lang->module_post_rebuilding_forum} ";
$this->debug->log->trace1("Finished rebuilding thread counters");
$import_session['counters_cleanup'] = 0;
echo $lang->done;
flush();
return;
}
$import_session['counters_cleanup'] = 1;
return;
}

$query = $db->simple_select("forums", "COUNT(*) as count", "import_fid != 0");
$num_imported_forums = $db->fetch_field($query, "count");
$progress = 0;
private function rebuild_forum_counters()
{
global $db, $output, $lang;

$query = $db->simple_select("forums", "fid", "import_fid != 0", array('order_by' => 'fid', 'order_dir' => 'asc'));
while($forum = $db->fetch_array($query))
{
rebuild_forum_counters($forum['fid']);
++$progress;
$output->update_progress_bar(round((($progress/$num_imported_forums)*50), 1)+100, $lang->sprintf($lang->module_post_forum_counter, $forum['fid']));
}
$this->debug->log->trace1("Rebuilding forum counters");
echo "{$lang->done}. <br />{$lang->module_post_rebuilding_forum} ";
flush();

$output->update_progress_bar(150);
$query = $db->simple_select("forums", "COUNT(*) as count", "import_fid != 0");
$num_imported_forums = $db->fetch_field($query, "count");
$progress = 0;

$query = $db->simple_select("forums", "fid", "import_fid != 0",
array('order_by' => 'fid', 'order_dir' => 'asc'));
while ($forum = $db->fetch_array($query)) {
rebuild_forum_counters($forum['fid']);
++$progress;
$output->update_progress_bar(round((($progress / $num_imported_forums) * 50), 1) + 100,
$lang->sprintf($lang->module_post_forum_counter, $forum['fid']));
}
}

$query = $db->simple_select("forums", "fid", "usepostcounts = 0");
while($forum = $db->fetch_array($query))
{
$fids[] = $forum['fid'];
}
private function rebuild_user_counters()
{
global $db, $output, $lang;

if(isset($fids) && is_array($fids))
{
$fids = implode(',', $fids);
}
$output->update_progress_bar(150);

if(!empty($fids))
{
$fids = " AND fid NOT IN($fids)";
}
else
{
$fids = "";
}
$query = $db->simple_select("forums", "fid", "usepostcounts = 0");
while($forum = $db->fetch_array($query))
{
$fids[] = $forum['fid'];
}

$this->debug->log->trace1("Rebuilding user counters");
echo "{$lang->done}. <br />{$lang->module_post_rebuilding_user} ";
flush();
if(isset($fids) && is_array($fids))
{
$fids = implode(',', $fids);
}

$query = $db->simple_select("users", "COUNT(*) as count", "import_uid != 0");
$num_imported_users = $db->fetch_field($query, "count");
$progress = $last_percent = 0;
if(!empty($fids))
{
$fids = " AND fid NOT IN($fids)";
}
else
{
$fids = "";
}

$query = $db->simple_select("users", "uid", "import_uid != 0");
while($user = $db->fetch_array($query))
{
$query2 = $db->simple_select("posts", "COUNT(*) AS post_count", "uid='{$user['uid']}' AND visible > 0{$fids}");
$num_posts = $db->fetch_field($query2, "post_count");
$db->free_result($query2);
$db->update_query("users", array("postnum" => intval($num_posts)), "uid='{$user['uid']}'");
$this->debug->log->trace1("Rebuilding user counters");
echo "{$lang->done}. <br />{$lang->module_post_rebuilding_user} ";
flush();

++$progress;
$percent = round((($progress/$num_imported_users)*50)+150, 1);
if($percent != $last_percent)
{
$output->update_progress_bar($percent, $lang->sprintf($lang->module_post_forum_counter, $user['uid']));
}
$last_percent = $percent;
$query = $db->simple_select("users", "COUNT(*) as count", "import_uid != 0");
$num_imported_users = $db->fetch_field($query, "count");
$progress = $last_percent = 0;

$query = $db->simple_select("users", "uid", "import_uid != 0");
while($user = $db->fetch_array($query))
{
$query2 = $db->simple_select("posts", "COUNT(*) AS post_count", "uid='{$user['uid']}' AND visible > 0{$fids}");
$num_posts = $db->fetch_field($query2, "post_count");
$db->free_result($query2);
$db->update_query("users", array("postnum" => intval($num_posts)), "uid='{$user['uid']}'");

++$progress;
$percent = round((($progress/$num_imported_users)*50)+150, 1);
if($percent != $last_percent)
{
$output->update_progress_bar($percent, $lang->sprintf($lang->module_post_forum_counter, $user['uid']));
}
// TODO: recount user posts doesn't seem to work
$last_percent = $percent;
}
// TODO: recount user posts doesn't seem to work

$output->update_progress_bar(200, $lang->please_wait);
$output->update_progress_bar(200, $lang->please_wait);

echo "{$lang->done}.<br />";
flush();
echo "{$lang->done}.<br />";
flush();

sleep(3);
}
sleep(3);
}

// For some reason this module is initialized seperatly so we need to add an empty function here
Expand Down

0 comments on commit 8749ddf

Please sign in to comment.