(* COCANWIKI - a wiki written in Objective CAML.
* Written by Richard W.M. Jones <rich@merjis.com>.
* Copyright (C) 2004 Merjis Ltd.
- * $Id: image.ml,v 1.15 2006/03/27 18:09:46 rich Exp $
+ * $Id: image.ml,v 1.16 2006/03/27 19:10:29 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
try Some (Int32.of_string (q#param "version")) with Not_found -> None in
(* Get the image and its MIME type. *)
- let what =
- if not is_thumbnail then "image, mime_type, name is null as deleted"
- else "thumbnail, tn_mime_type, name is null as deleted" in
- let where, args =
- match version with
- None -> "hostid = ? and name = ?", [Some hostid; Some image]
- | Some version ->
- "hostid = ? and (name = ? or name_deleted = ?) and id = ?",
- [Some hostid; Some image; Some image; Some version] in
-
- let sth = dbh#prepare_cached
- ("select " ^ what ^ " from images where " ^ where) in
- sth#execute args;
-
let data, mime_type, deleted =
try
- (match sth#fetch1 () with
- [ `Binary data; Some mime_type; `Bool deleted ] ->
- data, mime_type, deleted
- | _ -> assert false)
+ if not is_thumbnail then
+ List.hd (
+ match version with
+ | None ->
+ PGSQL(dbh) "select image, mime_type, name is null
+ from images
+ where hostid = $hostid and name = $image"
+ | Some version ->
+ PGSQL(dbh) "select image, mime_type, name is null
+ from images
+ where hostid = $hostid
+ and (name = $image or name_deleted = $image)
+ and id = $version"
+ )
+ else (
+ let data, mime_type, deleted =
+ List.hd (
+ match version with
+ | None ->
+ PGSQL(dbh) "select thumbnail, tn_mime_type, name is null
+ from images
+ where hostid = $hostid and name = $image"
+ | Some version ->
+ PGSQL(dbh) "select thumbnail, tn_mime_type, name is null
+ from images
+ where hostid = $hostid
+ and (name = $image or name_deleted = $image)
+ and id = $version"
+ ) in
+ Option.get data, Option.get mime_type, deleted
+ )
with
- Not_found -> raise (HttpError cHTTP_NOT_FOUND) in
+ Not_found | ExtList.List.Empty_list ->
+ raise (HttpError cHTTP_NOT_FOUND) in
+
+ let deleted = Option.get deleted in
(* If deleted, refuse to serve this image except if shown on the site. *)
if deleted then (
let referer =
try Table.get (Request.headers_in r) "Referer" with Not_found -> "" in
let ok =
- try String.find referer hostname; true
+ try ignore (String.find referer hostname); true
with Invalid_string -> false in
if not ok then (
(* Content-length header. *)
Table.set (Request.headers_out r) "Content-Length"
- (Int32.to_string (String.length data));
+ (string_of_int (String.length data));
q#header ~content_type:mime_type ();
ignore (print_string r data)