3 # Functions for rebuilding the link tracking tables; must
4 # be included within a script that also includes the Setup.
5 # See rebuildlinks.php, for example.
8 function rebuildLinkTablesPass1()
12 print "Rebuilding link tables (pass 1).\n";
14 $sql = "DROP TABLE IF EXISTS rebuildlinks";
17 $sql = "CREATE TABLE rebuildlinks (
18 rl_f_id int(8) unsigned NOT NULL default 0,
19 rl_f_title varchar(255) binary NOT NULL default '',
20 rl_to varchar(255) binary NOT NULL default '',
21 INDEX rl_to (rl_to) ) TYPE=MyISAM";
24 $sql = "LOCK TABLES cur READ, rebuildlinks WRITE";
27 $sql = "DELETE FROM rebuildlinks";
30 $sql = "SELECT cur_id,cur_namespace,cur_title,cur_text FROM cur";
31 $res = wfQuery( $sql );
32 $total = wfNumRows( $res );
34 $tc = Title::legalChars();
35 while ( $row = wfFetchObject( $res ) ) {
37 $ns = $wgLang->getNsText( $row->cur_namespace );
39 $title = addslashes( $row->cur_title );
41 $title = addslashes( "$ns:{$row->cur_title}" );
43 $text = $row->cur_text;
44 $numlinks = preg_match_all( "/\\[\\[([{$tc}]+)(]|\\|)/", $text,
45 $m, PREG_PATTERN_ORDER );
47 if ( 0 != $numlinks ) {
48 $sql = "INSERT INTO rebuildlinks (rl_f_id,rl_f_title,rl_to) VALUES ";
49 for ( $i = 0; $i < $numlinks; ++$i ) {
50 $nt = Title::newFromText( $m[1][$i] );
51 $dest = addslashes( $nt->getPrefixedDBkey() );
53 if ( 0 != $i ) { $sql .= ","; }
54 $sql .= "({$id},'{$title}','{$dest}')";
58 if ( ( ++$count % 1000 ) == 0 ) {
59 print "$count of $total articles scanned.\n";
62 print "$count articles scanned.\n";
63 mysql_free_result( $res );
65 $sql = "UNLOCK TABLES";
69 function rebuildLinkTablesPass2()
73 print "Rebuilding link tables (pass 2).\n";
75 $sql = "LOCK TABLES cur READ, rebuildlinks READ, " .
76 "links WRITE, brokenlinks WRITE, imagelinks WRITE";
79 $sql = "DELETE FROM links";
82 $sql = "DELETE FROM brokenlinks";
85 $sql = "DELETE FROM links";
88 $ins = $wgLang->getNsText( Namespace::getImage() );
89 $inslen = strlen($ins)+1;
90 $sql = "SELECT rl_f_title,rl_to FROM rebuildlinks " .
91 "WHERE rl_to LIKE '$ins:%'";
92 $res = wfQuery( $sql );
94 $sql = "INSERT INTO imagelinks (il_from,il_to) VALUES ";
97 while ( $row = wfFetchObject( $res ) ) {
98 $iname = addslashes( substr( $row->rl_to, $inslen ) );
99 $pname = addslashes( $row->rl_f_title );
101 if ( ! $first ) { $sqlX .= ","; }
104 $sqlX .= "('{$pname}','{$iname}')";
108 wfFreeResult( $res );
112 $sql = "SELECT DISTINCT rl_to FROM rebuildlinks " .
114 $res = wfQuery( $sql );
116 $total = wfNumRows( $res );
118 while ( $row = wfFetchObject( $res ) ) {
119 if ( 0 == strncmp( "$ins:", $row->rl_to, $inslen ) ) { continue; }
121 $nt = Title::newFromDBkey( $row->rl_to );
122 $id = $nt->getArticleID();
123 $to = addslashes( $row->rl_to );
126 $sql = "SELECT rl_f_id FROM rebuildlinks WHERE rl_to='{$to}'";
127 $res2 = wfQuery( $sql );
129 $sql = "INSERT INTO brokenlinks (bl_from,bl_to) VALUES ";
131 while ( $row2 = wfFetchObject( $res2 ) ) {
132 $from = $row2->rl_f_id;
133 if ( ! $first ) { $sql .= ","; }
135 $sql .= "({$from},'{$to}')";
137 wfFreeResult( $res2 );
138 if ( ! $first ) { wfQuery( $sql ); }
140 $sql = "SELECT rl_f_title FROM rebuildlinks WHERE rl_to='{$to}'";
141 $res2 = wfQuery( $sql );
143 $sql = "INSERT INTO links (l_from,l_to) VALUES ";
145 while ( $row2 = wfFetchObject( $res2 ) ) {
146 $from = addslashes( $row2->rl_f_title );
147 if ( ! $first ) { $sql .= ","; }
149 $sql .= "('{$from}',{$id})";
151 wfFreeResult( $res2 );
152 if ( ! $first ) { wfQuery( $sql ); }
154 if ( ( ++$count % 1000 ) == 0 ) {
155 print "$count of $total titles processed.\n";
158 wfFreeResult( $res );
160 $sql = "UNLOCK TABLES";
163 $sql = "DROP TABLE rebuildlinks";