+ # select existing catlinks for this page
+ $res = $dbw->select( $categorylinks, array( 'cl_to' ), array( 'cl_from' => $this->mId ),
+ $fname, 'FOR UPDATE' );
+
+ $del = array();
+ if(0 != $dbw->numRows( $res )) {
+ while ( $row = $dbw->fetchObject( $res ) ) {
+ if(!isset($add[$row->cl_to])) {
+ // in the db, but no longer in the page -> delete
+ $del[] = $row->cl_to;
+ } else {
+ // remove already existing category memberships
+ // from the add array
+ unset($add[$row->cl_to]);
+ }
+ }
+ }
+ // delete any removed categorylinks
+ if(count($del) > 0) {
+ // delete old ones
+ $sql = "DELETE FROM $categorylinks WHERE cl_from='{$this->mId}' AND cl_to IN('";
+ $sql .= implode("','", $del) . "')";
+ $dbw->query( $sql, $fname );
+ foreach($del as $cname){
+ $nt = Title::makeTitle( NS_CATEGORY, $cname );
+ $nt->invalidateCache();
+ // update the timestamp which indicates when the last article
+ // was added or removed to/from this article
+ $key = $wgDBname.':Category:'.$nt->getDBkey().':adddeltimestamp';
+ $messageMemc->set( $key , wfTimestamp( TS_MW ), 24*3600 );
+ #wfDebug( "Linksupdate:Cats:del: ".serialize($nt)." $key \n" );
+ }
+ }
+ // add any new category memberships
+ if (count($add) > 0) {