(* COCANWIKI - a wiki written in Objective CAML. * Written by Richard W.M. Jones . * Copyright (C) 2004 Merjis Ltd. * $Id: broken_links.ml,v 1.2 2006/03/27 18:09:46 rich Exp $ * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *) open Apache open Registry open Cgi open Printf open Cocanwiki open Cocanwiki_template let keys h = Hashtbl.fold (fun key _ xs -> key :: xs) h [] let run r (q : cgi) dbh hostid _ _ = let template = get_template dbh hostid "broken_links.html" in (* The links table (to_url) field can now point to a non-existant * page. It's from this observation that we are able to retrieve * the complete list of broken links. Links to empty template pages * aren't broken links either because some of the content is * synthesized. *) let rows = PGSQL(dbh) "select l.from_url, p.title, l.to_url from links l, pages p where l.hostid = $hostid and l.hostid = p.hostid and l.from_url = p.url and p.redirect is null and not exists (select id from pages where hostid = l.hostid and url = l.to_url) and not exists (select id from templates where l.to_url ~ url_regexp) order by 3, 1 desc" in (* Group the links together. *) let h = Hashtbl.create 32 in List.iter ( fun (from_url, from_title, to_url) -> let a = try Hashtbl.find h to_url with Not_found -> [] in let a = (from_url, from_title) :: a in Hashtbl.replace h to_url a ) rows; let keys = List.sort compare (keys h) in let table = List.map (fun to_url -> let values = Hashtbl.find h to_url in let table = List.map (fun (from_url, from_title) -> [ "page", Template.VarString from_url; "title", Template.VarString from_title ]) values in [ "url", Template.VarString to_url; "references", Template.VarTable table ]) keys in template#table "links" table; q#template template let () = register_script ~restrict:[CanView] run