Contact info dumper
authorAdam Chlipala <adamc@hcoop.net>
Sat, 19 Jan 2008 21:30:39 +0000 (21:30 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Sat, 19 Jan 2008 21:30:39 +0000 (21:30 +0000)
contact/.cvsignore [new file with mode: 0644]
contact/Makefile [new file with mode: 0644]
contact/contact.sh [new file with mode: 0755]
contact/contact.sig [new file with mode: 0644]
contact/contact.sml [new file with mode: 0644]
contact/sources.cm [new file with mode: 0644]

diff --git a/contact/.cvsignore b/contact/.cvsignore
new file mode 100644 (file)
index 0000000..8afcbd3
--- /dev/null
@@ -0,0 +1,2 @@
+.cm
+*.x86-linux
diff --git a/contact/Makefile b/contact/Makefile
new file mode 100644 (file)
index 0000000..c8cd939
--- /dev/null
@@ -0,0 +1,4 @@
+SMLBIN=/usr/local/sml/bin
+
+all:
+       $(SMLBIN)/ml-build sources.cm Contact.main contact
diff --git a/contact/contact.sh b/contact/contact.sh
new file mode 100755 (executable)
index 0000000..29c979b
--- /dev/null
@@ -0,0 +1 @@
+/usr/local/sml/bin/sml @SMLload=/afs/hcoop.net/user/h/hc/hcoop/portal/contact/contact.x86-linux
diff --git a/contact/contact.sig b/contact/contact.sig
new file mode 100644 (file)
index 0000000..1c577aa
--- /dev/null
@@ -0,0 +1,4 @@
+signature CONTACT =
+sig
+    val main : string * string list -> OS.Process.status
+end
diff --git a/contact/contact.sml b/contact/contact.sml
new file mode 100644 (file)
index 0000000..4b67641
--- /dev/null
@@ -0,0 +1,77 @@
+structure Contact :> CONTACT =
+struct
+
+structure C = PgClient
+
+fun main _ =
+    let
+       val db = C.conn "dbname='hcoop_hcoop'"
+
+       fun allEmails () =
+           let
+               fun s [v] = C.stringFromSql v
+                 | s _ = raise Fail "Bad allEmails row"
+           in
+               C.map db s
+                     "SELECT v FROM Contact JOIN ContactKind ON knd = ContactKind.id AND ContactKind.name = 'Non-hcoop e-mail' ORDER BY v"
+           end
+
+       fun kindRow [id, name, url, urlPrefix, urlPostfix] =
+           {id = C.intFromSql id,
+            name = C.stringFromSql name,
+            url = if C.boolFromSql url then
+                      SOME (C.stringFromSql urlPrefix,
+                            C.stringFromSql urlPostfix)
+                  else
+                      NONE}
+         | kindRow _ = raise Fail "Bad ContactKind row"
+
+       val kinds = C.map db kindRow "SELECT id, name, url, urlPrefix, urlPostfix FROM ContactKind ORDER BY name"
+
+       fun doOne (kind : {id : int, name : string, url : (string * string) option}) =
+           let
+               fun doOne [name, v] =
+                   let
+                       val name = C.stringFromSql name
+                       val v = C.stringFromSql v
+                   in
+                       print "<li> ";
+                       print (Web.html name);
+                       print ": ";
+                       case #url kind of
+                           NONE => print (Web.html v)
+                         | SOME (pre, post) =>
+                           (print "<a href=\"";
+                            print (Web.html (pre ^ v ^ post));
+                            print "\">";
+                            print (Web.html v);
+                            print "</a>");
+                       print "</li>\n"
+                   end
+                 | doOne _ = raise Fail "Bad Contact row"
+           in
+               print "<h2>";
+               print (#name kind);
+               print "</h2>\n<ol>\n";
+
+               C.app db doOne ("SELECT name, v FROM Contact JOIN WebUserActive ON usr = WebUserActive.id"
+                               ^ " WHERE knd = " ^ C.intToSql (#id kind)
+                               ^ " ORDER BY name, v");
+
+               print "</ol>\n\n"
+           end
+    in
+       print "<html><head><title>HCoop Emergency Contact Information</title></head><body><h1>HCoop Emergency Contact Information</h1>\n";
+
+       print "<h2><a href=\"mailto:";
+       print (String.concatWith "," (allEmails ()));
+       print "\">E-mail everyone (off-HCoop addresses)</a></h2>\n\n";
+
+       app doOne kinds;
+       print "</body></html>\n";
+       C.close db;
+       OS.Process.success
+    end handle C.Sql s => (print ("SQL failure: " ^ s ^ "\n");
+                          OS.Process.failure)
+
+end
diff --git a/contact/sources.cm b/contact/sources.cm
new file mode 100644 (file)
index 0000000..75b9a16
--- /dev/null
@@ -0,0 +1,9 @@
+Group is
+       $/basis.cm
+       $/smlnj-lib.cm
+       /usr/local/share/smlsql/smlsql.cm
+       /usr/local/share/smlsql/libpq/sources.cm
+       /usr/local/share/mlt/src/lib/sources.cm
+
+       contact.sig
+       contact.sml