namespacedupes.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 195 行
PHP
195 行
<?php# Copyright (C) 2005 Brion Vibber <brion@pobox.com># http://www.mediawiki.org/## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License along# with this program; if not, write to the Free Software Foundation, Inc.,# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.# http://www.gnu.org/copyleft/gpl.html$options = array( 'fix', 'suffix', 'help' );/** */require_once( 'commandLine.inc' );#require_once( 'maintenance/userDupes.inc' );if(isset( $options['help'] ) ) {print <<<ENDusage: namespaceDupes.php [--fix] [--suffix=<text>] [--help] --help : this help message --fix : attempt to automatically fix errors --suffix=<text> : dupes will be renamed with correct namespace with <text> appended after the article name.END;die;}class NamespaceConflictChecker { function NamespaceConflictChecker( &$db ) { $this->db =& $db; } function checkAll( $fix, $suffix = '' ) { global $wgContLang; $spaces = $wgContLang->getNamespaces(); $ok = true; foreach( $spaces as $ns => $name ) { $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok; } return $ok; } function checkNamespace( $ns, $name, $fix, $suffix = '' ) { echo "Checking namespace $ns: \"$name\"\n"; if( $name == '' ) { echo "... skipping article namespace\n"; return true; } $conflicts = $this->getConflicts( $ns, $name ); $count = count( $conflicts ); if( $count == 0 ) { echo "... no conflicts detected!\n"; return true; } echo "... $count conflicts detected:\n"; $ok = true; foreach( $conflicts as $row ) { $resolvable = $this->reportConflict( $row, $suffix ); $ok = $ok && $resolvable; if( $fix && ( $resolvable || $suffix != '' ) ) { $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok; } } return $ok; } /** * @fixme: do this for reals */ function checkPrefix( $key, $prefix, $fix, $suffix = '' ) { echo "Checking prefix \"$prefix\" vs namespace $key\n"; return $this->checkNamespace( $key, $prefix, $fix, $suffix ); } function getConflicts( $ns, $name ) { $page = $this->newSchema() ? 'page' : 'cur'; $table = $this->db->tableName( $page ); $prefix = $this->db->strencode( $name ); $likeprefix = str_replace( '_', '\\_', $prefix); $sql = "SELECT {$page}_id AS id, {$page}_title AS oldtitle, $ns AS namespace, TRIM(LEADING '$prefix:' FROM {$page}_title) AS title FROM {$table} WHERE {$page}_namespace=0 AND {$page}_title LIKE '$likeprefix:%'"; $result = $this->db->query( $sql, 'NamespaceConflictChecker::getConflicts' ); $set = array(); while( $row = $this->db->fetchObject( $result ) ) { $set[] = $row; } $this->db->freeResult( $result ); return $set; } function reportConflict( $row, $suffix ) { $newTitle = Title::makeTitle( $row->namespace, $row->title ); printf( "... %d (0,\"%s\") -> (%d,\"%s\") [[%s]]\n", $row->id, $row->oldtitle, $row->namespace, $row->title, $newTitle->getPrefixedText() ); $id = $newTitle->getArticleId(); if( $id ) { echo "... *** cannot resolve automatically; page exists with ID $id ***\n"; return false; } else { return true; } } function resolveConflict( $row, $resolvable, $suffix ) { if( !$resolvable ) { $row->title .= $suffix; $title = Title::makeTitle( $row->namespace, $row->title ); echo "... *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n"; } $tables = $this->newSchema() ? array( 'page' ) : array( 'cur', 'old' ); foreach( $tables as $table ) { $this->resolveConflictOn( $row, $table ); } return true; } function resolveConflictOn( $row, $table ) { $fname = 'NamespaceConflictChecker::resolveConflictOn'; echo "... resolving on $table... "; $this->db->update( $table, array( "{$table}_namespace" => $row->namespace, "{$table}_title" => $row->title, ), array( "{$table}_namespace" => 0, "{$table}_title" => $row->oldtitle, ), $fname ); echo "ok.\n"; return true; } function newSchema() { return class_exists( 'Revision' ); }}$wgTitle = Title::newFromText( 'Namespace title conflict cleanup script' );$fix = isset( $options['fix'] );$suffix = isset( $options['suffix'] ) ? $options['suffix'] : '';$prefix = isset( $options['prefix'] ) ? $options['prefix'] : '';$key = isset( $options['key'] ) ? intval( $options['key'] ) : 0;$dbw =& wfGetDB( DB_MASTER );$duper = new NamespaceConflictChecker( $dbw );if( $prefix ) { $retval = $duper->checkPrefix( $key, $prefix, $fix, $suffix );} else { $retval = $duper->checkAll( $fix, $suffix );}if( $retval ) { echo "\nLooks good!\n"; exit( 0 );} else { echo "\nOh noeees\n"; exit( -1 );}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?