/** * Remove a batch of users * * @param DatabaseBase $dbw * @param int[] $batch list of user IDs to remove */ private function removeBatch(DatabaseBase $dbw, array $batch) { $rows = 0; $dbw->begin(__METHOD__); // remove entries from user table $dbw->delete(self::USER_TABLE, ['user_id' => $batch], __METHOD__); $rows += $dbw->affectedRows(); // remove entries from user_properties table $dbw->delete('user_properties', ['up_user' => $batch], __METHOD__); $rows += $dbw->affectedRows(); $dbw->commit(__METHOD__); $this->info('Batch removed', ['batch' => count($batch), 'rows' => $rows]); }
/** * Perform a cleanup for a set of wikis * * @param DatabaseBase $db database handler * @param string $table name of table to clean up * @param string $wiki_id_column table column name to use when querying for wiki ID * @param Array $city_ids IDs of wikis to remove from the table */ private function doTableCleanup(DatabaseBase $db, $table, array $city_ids, $wiki_id_column = 'wiki_id') { $start = microtime(true); $db->delete($table, [$wiki_id_column => $city_ids], __METHOD__); $rows = $db->affectedRows(); // just in case MW decides to start a transaction automagically $db->commit(__METHOD__); Wikia\Logger\WikiaLogger::instance()->info(__METHOD__, ['table' => $table, 'cities' => join(', ', $city_ids), 'count' => count($city_ids), 'took' => round(microtime(true) - $start, 4), 'rows' => $rows]); $this->output(sprintf("%s: %s - removed %d rows\n", date('Y-m-d H:i:s'), $table, $rows)); // throttle delete queries if ($rows > 0) { sleep(5); } }
/** * @param DatabaseBase $dbw * @param string $table * @param string $column * @param string $wiki */ function doDeletes($dbw, $table, $column, $wiki) { if (!$dbw->tableExists($table)) { $this->error("Maintenance script cannot be run on this wiki as there is no {$table} table", 1); } $this->output("{$table}:\n"); $count = 0; do { $wikiQuoted = $dbw->addQuotes($wiki); $dbw->query("DELETE FROM {$table} WHERE {$column}={$wikiQuoted} LIMIT 500", __METHOD__); $affected = $dbw->affectedRows(); $count += $affected; $this->output("{$count}\n"); wfWaitForSlaves(); } while ($affected === 500); $this->output("{$count} {$table} rows deleted\n"); }
/** * @param DatabaseBase $dbw * @param string $table * @param string $column * @param string $wiki */ function doDeletes($dbw, $table, $column, $wiki) { if (!$dbw->tableExists($table)) { $this->error("Maintenance script cannot be run on this wiki as there is no {$table} table", 1); } $this->output("{$table}:\n"); $count = 0; do { // https://bugzilla.wikimedia.org/show_bug.cgi?id=52868 //$dbw->delete( // $table, // array( $column => $wiki ), // __METHOD__, // array( 'LIMIT' => 500 ), //); $wikiQuoted = $dbw->addQuotes($wiki); $dbw->query("DELETE FROM {$table} WHERE {$column}={$wikiQuoted} LIMIT 500", __METHOD__); $affected = $dbw->affectedRows(); $count += $affected; $this->output("{$count}\n"); wfWaitForSlaves(); } while ($affected === 500); $this->output("{$count} {$table} rows deleted\n"); }
/** * Print the results, callback for $db->sourceStream() * @param ResultWrapper $res The results object * @param DatabaseBase $db */ public function sqlPrintResult($res, $db) { if (!$res) { // Do nothing return; } elseif (is_object($res) && $res->numRows()) { foreach ($res as $row) { $this->output(print_r($row, true)); } } else { $affected = $db->affectedRows(); $this->output("Query OK, {$affected} row(s) affected\n"); } }
/** * Add row to the redirect table if this is a redirect, remove otherwise. * * @param DatabaseBase $dbw * @param Title $redirectTitle Title object pointing to the redirect target, * or NULL if this is not a redirect * @param null|bool $lastRevIsRedirect If given, will optimize adding and * removing rows in redirect table. * @return bool True on success, false on failure * @private */ public function updateRedirectOn($dbw, $redirectTitle, $lastRevIsRedirect = null) { // Always update redirects (target link might have changed) // Update/Insert if we don't know if the last revision was a redirect or not // Delete if changing from redirect to non-redirect $isRedirect = !is_null($redirectTitle); if (!$isRedirect && $lastRevIsRedirect === false) { return true; } if ($isRedirect) { $this->insertRedirectEntry($redirectTitle); } else { // This is not a redirect, remove row from redirect table $where = array('rd_from' => $this->getId()); $dbw->delete('redirect', $where, __METHOD__); } if ($this->getTitle()->getNamespace() == NS_FILE) { RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect($this->getTitle()); } return $dbw->affectedRows() != 0; }