54 $cacheKey = self::makeCacheKey( $page );
55 $cachedValue = $this->procCache->get( $cacheKey );
56 if ( $cachedValue !==
null ) {
57 return $cachedValue ?:
null;
62 $file = $this->repoGroup->findFile( $page );
63 if ( $file && !$file->isLocal() ) {
64 $from = $file->getRedirected();
65 $to = $file->getName();
66 if ( $from ===
null || $from === $to ) {
67 $this->procCache->set( $cacheKey,
false );
71 $target =
new TitleValue(
NS_FILE, $to );
72 $this->procCache->set( $cacheKey, $target );
77 $page = $this->pageLookup->getPageByReference( $page );
78 if ( $page ===
null || !$page->isRedirect() ) {
79 $this->procCache->set( $cacheKey,
false );
83 $dbr = $this->dbProvider->getReplicaDatabase();
84 $row = $dbr->newSelectQueryBuilder()
85 ->select( [
'rd_namespace',
'rd_title',
'rd_fragment',
'rd_interwiki' ] )
87 ->where( [
'rd_from' => $page->
getId() ] )
88 ->caller( __METHOD__ )
93 'Found inconsistent redirect status; probably the page was deleted after it was loaded'
95 $this->procCache->set( $cacheKey,
false );
99 $target = $this->createRedirectTarget(
106 $this->procCache->set( $cacheKey, $target );
123 ?
bool $lastRevWasRedirect =
null
128 $isRedirect = $target !==
null;
129 $cacheKey = self::makeCacheKey( $page );
131 if ( !$isRedirect && $lastRevWasRedirect ===
false ) {
132 $this->procCache->set( $cacheKey,
false );
137 $rt = Title::newFromLinkTarget( $target );
138 if ( !$rt->isValidRedirectTarget() ) {
140 $this->procCache->set( $cacheKey,
false );
144 $dbw = $this->dbProvider->getPrimaryDatabase();
145 $dbw->startAtomic( __METHOD__ );
147 $truncatedFragment = self::truncateFragment( $rt->getFragment() );
148 $queryBuilder = $dbw->newInsertQueryBuilder()
149 ->insertInto(
'redirect' )
151 'rd_from' => $page->
getId(),
152 'rd_namespace' => $rt->getNamespace(),
153 'rd_title' => $rt->getDBkey(),
154 'rd_fragment' => $truncatedFragment,
155 'rd_interwiki' => $rt->getInterwiki(),
157 ->onDuplicateKeyUpdate()
158 ->uniqueIndexFields( [
'rd_from' ] )
160 'rd_namespace' => $rt->getNamespace(),
161 'rd_title' => $rt->getDBkey(),
162 'rd_fragment' => $truncatedFragment,
163 'rd_interwiki' => $rt->getInterwiki(),
165 ->caller( __METHOD__ );
166 $queryBuilder->execute();
167 $dbw->endAtomic( __METHOD__ );
169 $this->linkWriteDuplicator->duplicate( $queryBuilder );
171 $this->procCache->set(
173 $this->createRedirectTarget(
181 $dbw = $this->dbProvider->getPrimaryDatabase();
183 $queryBuilder = $dbw->newDeleteQueryBuilder()
184 ->deleteFrom(
'redirect' )
185 ->where( [
'rd_from' => $page->
getId() ] )
186 ->caller( __METHOD__ );
187 $queryBuilder->execute();
189 $this->linkWriteDuplicator->duplicate( $queryBuilder );
191 $this->procCache->set( $cacheKey,
false );
195 $this->repoGroup->getLocalRepo()->invalidateImageRedirect( $page );
230 private function createRedirectTarget( $namespace, $title, $fragment, $interwiki ): ?LinkTarget {
246 $target = $this->titleParser->makeTitleValueSafe( $namespace, $title, $fragment, $interwiki );