wiki.techinc.nl/includes/deferred/LinksUpdate/ExternalLinksTable.php
James D. Forrester 9bfb75ff90 Namespace ParserOutput
Most used non-namespaced class!

Bug: T353458
Change-Id: I4c2cbb0a808b3881a4d6ca489eee5d8c8ebf26cf
2023-12-14 14:57:34 -05:00

120 lines
2.9 KiB
PHP

<?php
namespace MediaWiki\Deferred\LinksUpdate;
use MediaWiki\ExternalLinks\LinkFilter;
use MediaWiki\Parser\ParserOutput;
/**
* externallinks
*
* Link ID format: string URL
*
* @since 1.38
*/
class ExternalLinksTable extends LinksTable {
private $newLinks = [];
private $existingLinks;
public function setParserOutput( ParserOutput $parserOutput ) {
foreach ( $parserOutput->getExternalLinks() as $url => $unused ) {
foreach ( LinkFilter::makeIndexes( $url ) as [ $domainIndex, $path ] ) {
$this->newLinks[$domainIndex][$path] = true;
}
}
}
protected function getTableName() {
return 'externallinks';
}
protected function getFromField() {
return 'el_from';
}
protected function getExistingFields() {
return [ 'el_to_domain_index', 'el_to_path' ];
}
/**
* Get the existing links as an array
*
* @return array
*/
private function getExistingLinks() {
if ( $this->existingLinks === null ) {
$this->existingLinks = [];
foreach ( $this->fetchExistingRows() as $row ) {
$this->existingLinks[$row->el_to_domain_index][$row->el_to_path] = true;
}
}
return $this->existingLinks;
}
protected function getNewLinkIDs() {
foreach ( $this->newLinks as $domainIndex => $paths ) {
foreach ( $paths as $path => $unused ) {
yield [ (string)$domainIndex, (string)$path ];
}
}
}
protected function getExistingLinkIDs() {
foreach ( $this->getExistingLinks() as $domainIndex => $paths ) {
foreach ( $paths as $path => $unused ) {
yield [ (string)$domainIndex, (string)$path ];
}
}
}
protected function isExisting( $linkId ) {
[ $domainIndex, $path ] = $linkId;
return isset( $this->getExistingLinks()[$domainIndex][$path] );
}
protected function isInNewSet( $linkId ) {
[ $domainIndex, $path ] = $linkId;
return isset( $this->newLinks[$domainIndex][$path] );
}
protected function insertLink( $linkId ) {
[ $domainIndex, $path ] = $linkId;
$params = [
'el_to_domain_index' => substr( $domainIndex, 0, 255 ),
'el_to_path' => $path,
];
$this->insertRow( $params );
}
protected function deleteLink( $linkId ) {
[ $domainIndex, $path ] = $linkId;
$this->deleteRow( [
'el_to_domain_index' => substr( $domainIndex, 0, 255 ),
'el_to_path' => $path
] );
if ( $path === '' ) {
// el_to_path is nullable, but null is not valid in php arrays,
// so both values are handled as one key, delete both rows when exists
$this->deleteRow( [
'el_to_domain_index' => substr( $domainIndex, 0, 255 ),
'el_to_path' => null
] );
}
}
/**
* Get an array of URLs of the given type
*
* @param int $setType One of the link set constants as in LinksTable::getLinkIDs()
* @return string[]
*/
public function getStringArray( $setType ) {
$ids = $this->getLinkIDs( $setType );
$stringArray = [];
foreach ( $ids as $linkId ) {
[ $domainIndex, $path ] = $linkId;
$stringArray[] = LinkFilter::reverseIndexes( $domainIndex ) . $path;
}
return $stringArray;
}
}