public function execute()
 {
     global $wgEchoCluster;
     $reader = new EchoBatchRowIterator(MWEchoDbFactory::getDB(DB_SLAVE), $this->table, $this->idField, $this->mBatchSize);
     $reader->addConditions(array("event_page_title IS NOT NULL", "event_page_id" => null));
     $updater = new EchoBatchRowUpdate($reader, new EchoBatchRowWriter(MWEchoDbFactory::getDB(DB_MASTER), $this->table, $wgEchoCluster), new EchoSuppressionRowUpdateGenerator());
     $updater->setOutput(array($this, '__internalOutput'));
     $updater->execute();
 }
 protected function doDBUpdates()
 {
     $container = Container::getContainer();
     $dbFactory = $container['db.factory'];
     $dbw = $dbFactory->getDb(DB_MASTER);
     $storage = $container['storage'];
     $moderationLoggingListener = $container['storage.post.listeners.moderation_logging'];
     $rowIterator = new EchoBatchRowIterator($dbw, 'flow_revision', 'rev_id', $this->mBatchSize);
     $rowIterator->setFetchColumns(array('rev_id', 'rev_type'));
     // Fetch rows that are a moderation action
     $rowIterator->addConditions(array('rev_change_type' => ModerationLoggingListener::getModerationChangeTypes(), 'rev_user_wiki' => wfWikiID()));
     $start = $this->getOption('start');
     $startId = UUID::create($start);
     $rowIterator->addConditions(array('rev_id > ' . $dbw->addQuotes($startId->getBinary())));
     $stop = $this->getOption('stop');
     $stopId = UUID::create($stop);
     $rowIterator->addConditions(array('rev_id < ' . $dbw->addQuotes($stopId->getBinary())));
     $total = $fail = 0;
     foreach ($rowIterator as $batch) {
         $dbw->begin();
         foreach ($batch as $row) {
             $total++;
             $objectManager = $storage->getStorage($row->rev_type);
             $revId = UUID::create($row->rev_id);
             $obj = $objectManager->get($revId);
             if (!$obj) {
                 $this->error('Could not load revision: ' . $revId->getAlphadecimal());
                 $fail++;
                 continue;
             }
             $workflow = $obj->getCollection()->getWorkflow();
             $moderationLoggingListener->onAfterInsert($obj, array(), array('workflow' => $workflow));
         }
         $dbw->commit();
         $storage->clear();
         $dbFactory->waitForSlaves();
     }
     $this->output("Processed a total of {$total} moderation revisions.\n");
     if ($fail !== 0) {
         $this->error("Errors were encountered while processing {$fail} of them.\n");
     }
     return true;
 }
 protected function doDBUpdates()
 {
     $iterator = new EchoBatchRowIterator(wfGetDB(DB_SLAVE), 'logging', 'log_id', $this->mBatchSize);
     $iterator->setFetchColumns(array('log_id', 'log_params'));
     $iterator->addConditions(array('log_type' => array('delete', 'suppress'), 'log_action' => array('flow-delete-post', 'flow-suppress-post', 'flow-restore-post', 'flow-delete-topic', 'flow-suppress-topic', 'flow-restore-topic')));
     $updater = new EchoBatchRowUpdate($iterator, new EchoBatchRowWriter(wfGetDB(DB_MASTER), 'logging'), new LogRowUpdateGenerator($this));
     $updater->setOutput(array($this, 'output'));
     $updater->execute();
     return true;
 }
 public function execute()
 {
     global $wgFlowCluster;
     $dbFactory = Container::get('db.factory');
     $storage = Container::get('storage');
     $rootPostLoader = Container::get('loader.root_post');
     $iterator = new EchoBatchRowIterator($dbFactory->getDB(DB_SLAVE), 'flow_workflow', 'workflow_id', $this->mBatchSize);
     $iterator->setFetchColumns(array('workflow_id', 'workflow_type', 'workflow_last_update_timestamp'));
     $iterator->addConditions(array('workflow_wiki' => wfWikiId()));
     $updater = new EchoBatchRowUpdate($iterator, new UpdateWorkflowLastUpdateTimestampWriter($storage, $wgFlowCluster), new UpdateWorkflowLastUpdateTimestampGenerator($storage, $rootPostLoader));
     $updater->setOutput(array($this, 'output'));
     $updater->execute();
 }
 /**
  * Assembles the update components, runs them, and reports
  * on what they did
  */
 public function doDbUpdates()
 {
     global $wgFlowCluster, $wgLang;
     $dbw = Container::get('db.factory')->getDB(DB_MASTER);
     $it = new EchoBatchRowIterator($dbw, 'flow_workflow', 'workflow_id', $this->mBatchSize);
     $it->setFetchColumns(array('*'));
     $it->addConditions(array('workflow_wiki' => wfWikiId()));
     $gen = new WorkflowPageIdUpdateGenerator($wgLang);
     $writer = new EchoBatchRowWriter($dbw, 'flow_workflow', $wgFlowCluster);
     $updater = new EchoBatchRowUpdate($it, $writer, $gen);
     $updater->execute();
     $this->output($gen->report());
     return true;
 }
 public function doDBUpdates()
 {
     // Can't be done in constructor, happens too early in
     // boot process
     $this->dbFactory = Container::get('db.factory');
     $this->storage = Container::get('storage');
     // Since this is a one-shot maintenance script just reach in via reflection
     // to change lenghts
     $this->contentLengthProperty = new ReflectionProperty('Flow\\Model\\AbstractRevision', 'contentLength');
     $this->contentLengthProperty->setAccessible(true);
     $this->previousContentLengthProperty = new ReflectionProperty('Flow\\Model\\AbstractRevision', 'previousContentLength');
     $this->previousContentLengthProperty->setAccessible(true);
     $dbw = $this->dbFactory->getDb(DB_MASTER);
     // Walk through the flow_revision table
     $it = new EchoBatchRowIterator($dbw, 'flow_revision', 'rev_id', $this->mBatchSize);
     // Only fetch rows created by users from the current wiki.
     $it->addConditions(array('rev_user_wiki' => wfWikiId()));
     // We only need the id and type field
     $it->setFetchColumns(array('rev_id', 'rev_type'));
     $total = $fail = 0;
     foreach ($it as $batch) {
         $dbw->begin();
         foreach ($batch as $row) {
             $total++;
             if (!isset(self::$revisionTypes[$row->rev_type])) {
                 $this->output('Unknown revision type: ' . $row->rev_type);
                 $fail++;
                 continue;
             }
             $om = $this->storage->getStorage(self::$revisionTypes[$row->rev_type]);
             $revId = UUID::create($row->rev_id);
             $obj = $om->get($revId);
             if (!$obj) {
                 $this->output('Could not load revision: ' . $revId->getAlphadecimal());
                 $fail++;
                 continue;
             }
             if ($obj->isFirstRevision()) {
                 $previous = null;
             } else {
                 $previous = $om->get($obj->getPrevRevisionId());
                 if (!$previous) {
                     $this->output('Could not locate previous revision: ' . $obj->getPrevRevisionId()->getAlphadecimal());
                     $fail++;
                     continue;
                 }
             }
             $this->updateRevision($obj, $previous);
             try {
                 $om->put($obj);
             } catch (\Exception $e) {
                 $this->error('Failed to update revision ' . $obj->getRevisionId()->getAlphadecimal() . ': ' . $e->getMessage() . "\n" . 'Please make sure rev_content, rev_content_length, rev_flags & rev_previous_content_length are part of RevisionStorage::$allowedUpdateColumns.');
                 throw $e;
             }
             $this->output('.');
         }
         $dbw->commit();
         $this->storage->clear();
         $this->dbFactory->waitForSlaves();
     }
     return true;
 }
<?php

require_once "{$IP}/maintenance/commandLine.inc";
require_once "{$IP}/extensions/Flow/FlowActions.php";
$moderationChangeTypes = array('hide-post', 'hide-topic', 'delete-post', 'delete-topic', 'suppress-post', 'suppress-topic', 'lock-topic', 'restore-post', 'restore-topic');
$csvOutput = fopen('repair_results_from_parent_' . wfWikiId() . '.csv', 'w');
if (!$csvOutput) {
    die("Could not open results file\n");
}
fputcsv($csvOutput, array("uuid", "esurl", "flags"));
$dbr = Flow\Container::get('db.factory')->getDB(DB_SLAVE);
$it = new EchoBatchRowIterator($dbr, 'flow_revision', array('rev_id'), 10);
$it->addConditions(array('rev_user_wiki' => wfWikiId()));
$it->setFetchColumns(array('rev_change_type', 'rev_parent_id'));
$totalNullContentWithParent = 0;
$totalNullParentContent = 0;
$totalBadQueryResult = 0;
$totalMatched = 0;
foreach ($it as $batch) {
    foreach ($batch as $rev) {
        $item = ExternalStore::fetchFromURL($rev->rev_content);
        if ($item) {
            // contains valid data
            continue;
        }
        $changeType = $rev->rev_change_type;
        while (is_string($wgFlowActions[$changeType])) {
            $changeType = $wgFlowActions[$changeType];
        }
        if (!in_array($changeType, $moderationChangeTypes)) {
            // doesn't inherit content
 /**
  * Slightly hackish to use reflection, but asserting different parameters
  * to consecutive calls of DatabaseBase::select in phpunit is error prone
  *
  * @dataProvider provider_readerSelectConditions
  */
 public function testReaderSelectConditionsMultiplePrimaryKeys($message, $expectedSecondIteration, $primaryKeys, $batchSize = 3)
 {
     $results = $this->genSelectResult($batchSize, $batchSize * 3, function () {
         static $i = 0, $j = 100, $k = 1000;
         return array('id_field' => ++$i, 'foo' => ++$j, 'bar' => ++$k);
     });
     $db = $this->mockDbConsecutiveSelect($results);
     $conditions = array('bar' => 42, 'baz' => 'hai');
     $reader = new EchoBatchRowIterator($db, 'some_table', $primaryKeys, $batchSize);
     $reader->addConditions($conditions);
     $buildConditions = new ReflectionMethod($reader, 'buildConditions');
     $buildConditions->setAccessible(true);
     // On first iteration only the passed conditions must be used
     $this->assertEquals($conditions, $buildConditions->invoke($reader), 'First iteration must return only the conditions passed in addConditions');
     $reader->rewind();
     // Second iteration must use the maximum primary key of last set
     $this->assertEquals($conditions + $expectedSecondIteration, $buildConditions->invoke($reader), $message);
 }