{-# LANGUAGE OverloadedStrings #-} import Control.Concurrent (threadDelay) import Control.Exception (bracket) import System.Exit (exitWith, ExitCode(..)) import System.Environment (getArgs) import Data.Configurator (load, Worth(..), require, lookupDefault) import Data.String (fromString) import Database.PostgreSQL.Simple main :: IO () main = do args <- getArgs if length args /= 1 then putStrLn "config file argument required" >> exitWith (ExitFailure 1) else do config <- load [Required (head args)] host <- lookupDefault "127.0.0.1" config "host" port <- lookupDefault 5432 config "port" user <- require config "user" pass <- require config "pass" db <- require config "db" cols <- require config "columns" bracket (connect $ defaultConnectInfo { connectHost = host, connectPort = port, connectUser = user, connectPassword = pass, connectDatabase = db }) close (runQueue cols) runQueue :: String -> Connection -> IO () runQueue cols c = do withTransaction c $ do execute_ c (fromString $ "INSERT INTO amazon_email_archive SELECT " ++ cols ++ " FROM amazon_email_queue WHERE sent_at IS NOT NULL") execute_ c "DELETE FROM amazon_email_queue WHERE sent_at IS NOT NULL" threadDelay 60000000 -- clean once per minute runQueue cols c