21 parent::__construct();
22 $this->
addDescription(
'Remove autopatrol logs in the logging table' );
23 $this->
addOption(
'dry-run',
'Print debug info instead of actually deleting' );
26 'Check old patrol logs (for deleting old format autopatrols).'
30 'Timestamp to delete only before that time, all MediaWiki timestamp formats are accepted',
36 'First row (log id) to start updating from',
42 'Sleep time (in seconds) between every batch',
52 $sleep = (int)$this->
getOption(
'sleep', 10 );
53 $fromId = $this->
getOption(
'from-id',
null );
57 $rowsData = $this->getRowsOld( $fromId );
62 $rows = $rowsData[
'rows'];
63 $fromId = $rowsData[
'lastId'];
70 $rows = $this->getRows( $fromId );
74 $fromId = end( $rows );
78 $this->
output(
'These rows will get deleted: ' . implode(
', ', $rows ) .
"\n" );
80 $this->deleteRows( $rows );
81 $this->
output(
'Processed up to row id ' . end( $rows ) .
"\n" );
90 private function getRows( ?
int $fromId ): array {
92 $before = $this->
getOption(
'before',
false );
95 'log_type' =>
'patrol',
96 'log_action' =>
'autopatrol',
100 $conds[] = $dbr->expr(
'log_id',
'>', $fromId );
104 $conds[] = $dbr->expr(
'log_timestamp',
'<', $dbr->timestamp( $before ) );
107 return $dbr->newSelectQueryBuilder()
111 ->orderBy(
'log_id' )
113 ->caller( __METHOD__ )
114 ->fetchFieldValues();
117 private function getRowsOld( ?
int $fromId ): ?array {
118 $dbr = $this->getReplicaDB();
119 $batchSize = $this->getBatchSize();
120 $before = $this->getOption(
'before',
false );
123 'log_type' =>
'patrol',
124 'log_action' =>
'patrol',
128 $conds[] = $dbr->expr(
'log_id',
'>', $fromId );
132 $conds[] = $dbr->expr(
'log_timestamp',
'<', $dbr->timestamp( $before ) );
135 $result = $dbr->newSelectQueryBuilder()
136 ->select( [
'log_id',
'log_params' ] )
139 ->orderBy(
'log_id' )
140 ->limit( $batchSize )
141 ->caller( __METHOD__ )
146 foreach ( $result as $row ) {
147 $last = $row->log_id;
148 $logEntry = DatabaseLogEntry::newFromRow( $row );
149 $params = $logEntry->getParameters();
150 if ( !is_array( $params ) ) {
158 if ( array_key_exists(
'6::auto', $params ) ) {
160 $auto =
$params[
'6::auto'] ===
true;
161 } elseif ( $logEntry->isLegacy() && array_key_exists( 2, $params ) ) {
169 $autopatrols[] = $row->log_id;
173 if ( $last ===
null ) {
177 return [
'rows' => $autopatrols,
'lastId' => $last ];
180 private function deleteRows( array $rows ) {
181 $dbw = $this->getPrimaryDB();
183 $dbw->newDeleteQueryBuilder()
184 ->deleteFrom(
'logging' )
185 ->where( [
'log_id' => $rows ] )
186 ->caller( __METHOD__ )->execute();
188 $this->waitForReplication();
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.