module Job.Model ( Job(..) , getLastExecution , actualizeLastExecution , actualizeLastCheck ) where import Data.Time.Clock (UTCTime, getCurrentTime) import Database.SQLite.Simple (Only (Only)) import qualified Database.SQLite.Simple as SQLite import Prelude hiding (id) import Job.Kind import Model.Query (Query (Query)) data Job = Job { id :: String , kind :: Kind , lastExecution :: Maybe UTCTime , lastCheck :: Maybe UTCTime } deriving (Show) getLastExecution :: Kind -> Query (Maybe UTCTime) getLastExecution jobKind = Query (\conn -> do result <- SQLite.query conn "SELECT last_execution FROM job WHERE kind = ?" (Only jobKind) :: IO [Only UTCTime] return $ case result of [Only time] -> Just time _ -> Nothing ) actualizeLastExecution :: Kind -> UTCTime -> Query () actualizeLastExecution jobKind time = Query (\conn -> do result <- SQLite.query conn "SELECT 1 FROM job WHERE kind = ?" (Only jobKind) :: IO [Only Int] let hasJob = case result of [Only _] -> True _ -> False if hasJob then SQLite.execute conn "UPDATE job SET last_execution = ? WHERE kind = ?" (time, jobKind) else SQLite.execute conn "INSERT INTO job (kind, last_execution, last_check) VALUES (?, ?, ?)" (jobKind, time, time) ) actualizeLastCheck :: Kind -> Query () actualizeLastCheck jobKind = Query (\conn -> do now <- getCurrentTime SQLite.execute conn "UPDATE job SET kind = ? WHERE last_check = ?" (jobKind, now) )