Table for server-side configuration settings. Will be used to store location of...
[cocanwiki.git] / scripts / cocanwiki.ml
index 55097e4..96cef37 100644 (file)
@@ -1,7 +1,7 @@
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: cocanwiki.ml,v 1.9 2004/09/22 10:19:26 rich Exp $
+ * $Id: cocanwiki.ml,v 1.10 2004/09/23 11:51:17 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
@@ -34,6 +34,41 @@ module Pool = DbiPool (Dbi_postgres)
  *)
 let _get_dbh r = Pool.get r "cocanwiki"
 
+(* Server-wide settings.
+ *
+ * These are stored in a single row in the database in the table
+ * 'server_settings'.  You must restart the server if you change
+ * this row.
+ *
+ * It's not possible to read these at server start-up time because the
+ * Apache server is still running as 'root' and will not normally be
+ * allowed to access the database.  We thus read them at the earliest
+ * opportunity, in a request context, and cache the results.
+ *)
+let server_settings_version =
+  let settings = ref None in
+  let get_settings (dbh : Dbi.connection) =
+    let sth = dbh#prepare "select version from server_settings" in
+    sth#execute [];
+    let s =
+      match sth#fetch1 () with
+       | [ `Int version ] -> version
+       | _ -> assert false in
+    sth#finish ();
+    settings := Some s;
+    s
+  in
+
+  let server_settings_version dbh =
+    let (version) =
+      match !settings with
+         None -> get_settings dbh
+       | Some settings -> settings in
+    version
+  in
+
+  server_settings_version
+
 (* The [CgiExit] exception should be folded back into the base
  * mod_caml code at some point.  It just causes the 'run' function to
  * return at that point safely.  (XXX)