page = $page; if ( $page->exists() ) { $this->pageId = $page->getId(); } elseif ( $pageId ) { $this->pageId = $pageId; } else { throw new MWException( "Page ID not known, perhaps the page doesn't exist?" ); } } public function doUpdate() { # Page may already be deleted, so don't just getId() $id = $this->pageId; # Delete restrictions for it $this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ ); # Fix category table counts $cats = $this->mDb->selectFieldValues( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ ); $this->page->updateCategoryCounts( array(), $cats ); # If using cascading deletes, we can skip some explicit deletes if ( !$this->mDb->cascadingDeletes() ) { # Delete outgoing links $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ ); $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ ); $this->mDb->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ ); $this->mDb->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ ); $this->mDb->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ ); $this->mDb->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ ); $this->mDb->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ ); $this->mDb->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ ); $this->mDb->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ ); } # If using cleanup triggers, we can skip some manual deletes if ( !$this->mDb->cleanupTriggers() ) { $title = $this->page->getTitle(); # Find recentchanges entries to clean up... $rcIdsForTitle = $this->mDb->selectFieldValues( 'recentchanges', 'rc_id', array( 'rc_type != ' . RC_LOG, 'rc_namespace' => $title->getNamespace(), 'rc_title' => $title->getDBkey() ), __METHOD__ ); $rcIdsForPage = $this->mDb->selectFieldValues( 'recentchanges', 'rc_id', array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ), __METHOD__ ); # T98706: delete PK to avoid lock contention with RC delete log insertions $rcIds = array_merge( $rcIdsForTitle, $rcIdsForPage ); if ( $rcIds ) { $this->mDb->delete( 'recentchanges', array( 'rc_id' => $rcIds ), __METHOD__ ); } } } public function getAsJobSpecification() { return array( 'wiki' => $this->mDb->getWikiID(), 'job' => new JobSpecification( 'deleteLinks', array( 'pageId' => $this->pageId ), array( 'removeDuplicates' => true ), $this->page->getTitle() ) ); } }