Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
CRAP | |
100.00% |
48 / 48 |
reclean | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
9 | |
100.00% |
48 / 48 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
configure | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
execute | |
100.00% |
1 / 1 |
2 | |
100.00% |
14 / 14 |
|||
reclean_usernames | |
100.00% |
1 / 1 |
4 | |
100.00% |
20 / 20 |
|||
get_count | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
<?php | |
/** | |
* | |
* This file is part of the phpBB Forum Software package. | |
* | |
* @copyright (c) phpBB Limited <https://www.phpbb.com> | |
* @license GNU General Public License, version 2 (GPL-2.0) | |
* | |
* For full copyright and license information, please see | |
* the docs/CREDITS.txt file. | |
* | |
*/ | |
namespace phpbb\console\command\user; | |
use phpbb\console\command\command; | |
use phpbb\db\driver\driver_interface; | |
use phpbb\language\language; | |
use phpbb\user; | |
use Symfony\Component\Console\Helper\ProgressBar; | |
use Symfony\Component\Console\Input\InputInterface; | |
use Symfony\Component\Console\Output\OutputInterface; | |
use Symfony\Component\Console\Style\SymfonyStyle; | |
class reclean extends command | |
{ | |
/** @var driver_interface */ | |
protected $db; | |
/** @var language */ | |
protected $language; | |
/** @var int A count of the number of re-cleaned user names */ | |
protected $processed; | |
/** @var ProgressBar */ | |
protected $progress; | |
/** | |
* Construct method | |
* | |
* @param user $user | |
* @param driver_interface $db | |
* @param language $language | |
*/ | |
public function __construct(user $user, driver_interface $db, language $language) | |
{ | |
$this->db = $db; | |
$this->language = $language; | |
parent::__construct($user); | |
} | |
/** | |
* Sets the command name and description | |
* | |
* @return null | |
*/ | |
protected function configure() | |
{ | |
$this | |
->setName('user:reclean') | |
->setDescription($this->language->lang('CLI_DESCRIPTION_USER_RECLEAN')) | |
->setHelp($this->language->lang('CLI_HELP_USER_RECLEAN')) | |
; | |
} | |
/** | |
* Executes the command user:reclean | |
* | |
* Cleans user names that are unclean. | |
* | |
* @param InputInterface $input The input stream used to get the options | |
* @param OutputInterface $output The output stream, used to print messages | |
* | |
* @return int 0 if all is well, 1 if any errors occurred | |
*/ | |
protected function execute(InputInterface $input, OutputInterface $output) | |
{ | |
$io = new SymfonyStyle($input, $output); | |
$io->section($this->language->lang('CLI_USER_RECLEAN_START')); | |
$this->processed = 0; | |
$this->progress = $this->create_progress_bar($this->get_count(), $io, $output); | |
$this->progress->setMessage($this->language->lang('CLI_USER_RECLEAN_START')); | |
$this->progress->start(); | |
$stage = 0; | |
while ($stage !== true) | |
{ | |
$stage = $this->reclean_usernames($stage); | |
} | |
$this->progress->finish(); | |
$io->newLine(2); | |
$io->success($this->language->lang('CLI_USER_RECLEAN_DONE', $this->processed)); | |
return 0; | |
} | |
/** | |
* Re-clean user names | |
* Only user names that are unclean will be re-cleaned | |
* | |
* @param int $start An offset index | |
* @return bool|int Return the next offset index or true if all records have been processed. | |
*/ | |
protected function reclean_usernames($start = 0) | |
{ | |
$limit = 500; | |
$i = 0; | |
$this->db->sql_transaction('begin'); | |
$sql = 'SELECT user_id, username, username_clean FROM ' . USERS_TABLE; | |
$result = $this->db->sql_query_limit($sql, $limit, $start); | |
while ($row = $this->db->sql_fetchrow($result)) | |
{ | |
$i++; | |
$username_clean = $this->db->sql_escape(utf8_clean_string($row['username'])); | |
if ($username_clean != $row['username_clean']) | |
{ | |
$sql = 'UPDATE ' . USERS_TABLE . " | |
SET username_clean = '$username_clean' | |
WHERE user_id = {$row['user_id']}"; | |
$this->db->sql_query($sql); | |
$this->processed++; | |
} | |
$this->progress->advance(); | |
} | |
$this->db->sql_freeresult($result); | |
$this->db->sql_transaction('commit'); | |
return ($i < $limit) ? true : $start + $i; | |
} | |
/** | |
* Get the count of users in the database | |
* | |
* @return int | |
*/ | |
protected function get_count() | |
{ | |
$sql = 'SELECT COUNT(user_id) AS count FROM ' . USERS_TABLE; | |
$result = $this->db->sql_query($sql); | |
$count = (int) $this->db->sql_fetchfield('count'); | |
$this->db->sql_freeresult($result); | |
return $count; | |
} | |
} |