1 {-# OPTIONS_GHC -fglasgow-exts -XOverloadedStrings #-}
4 import Ella.Processors.General (addSlashRedirectView)
6 import Control.Exception (catchDyn)
7 import Database.HDBC (quickQuery, toSql, SqlError, commit)
8 import Database.HDBC.Sqlite3 (connectSqlite3)
12 sqlite_path = "/home/luke/httpd/lukeplant.me.uk/web/cgi-bin/data/addresses.db"
16 connect = connectSqlite3 sqlite_path
18 updateStatement = "UPDATE addresses SET send_email = ? WHERE id = ?;"
19 queryStatement = "SELECT email FROM addresses WHERE id = ?;"
21 update :: Bool -> String -> IO Bool
22 update addthem personid = do
24 retval <- idpresent conn personid
27 quickQuery conn updateStatement [toSql addthem, toSql personid]
36 idpresent conn personid = do
37 vals <- quickQuery conn queryStatement [toSql personid]
38 return (length vals == 1)
42 sqlErrorHandler = \e -> do
43 let errMessage = show (e :: SqlError)
44 let resp = default500 errMessage
49 views = [ addSlashRedirectView
50 , "yes/" <+/> stringParam //-> addEmailView $ []
51 , "no/" <+/> stringParam //-> removeEmailView $ []
56 message content = buildResponse [addContent content] utf8HtmlResponse
58 idNotFoundResponse = message "Sorry, the URL entered does not correspond to any known email address. Please check you entered the full URL."
59 addedResponse = message "Thanks, I'll add you to my list."
60 removedResponse = message "Thanks, you won't be added you to my list."
62 addEmailView personid req = do
63 updated <- confirm personid
64 return $ Just $ if (not updated)
65 then idNotFoundResponse
68 removeEmailView personid req = do
69 updated <- remove personid
70 return $ Just $ if (not updated)
71 then idNotFoundResponse
78 dispatchCGI views defaultDispatchOptions