You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.5 KiB
78 lines
2.5 KiB
{-# LANGUAGE OverloadedStrings #-} |
|
|
|
module ATrade.MDS.Database ( |
|
) where |
|
|
|
import qualified Data.Configurator as C |
|
import qualified Data.Text as T |
|
import qualified Data.Vector as V |
|
import ATrade.Types |
|
import Data.Time.Clock |
|
import Control.Concurrent.MVar |
|
import Control.Concurrent |
|
import System.Log.Logger |
|
import Database.HDBC |
|
import Database.HDBC.PostgreSQL |
|
|
|
data TimeInterval = TimeInterval UTCTime UTCTime |
|
|
|
data Timeframe = Timeframe Int |
|
|
|
timeframeDaily = Timeframe 86400 |
|
timeframeHour = Timeframe 3600 |
|
timeframeMinute = Timeframe 60 |
|
|
|
data DatabaseCommand = DBGet TickerId TimeInterval Timeframe | DBPut TickerId TimeInterval Timeframe (V.Vector Bar) |
|
data DatabaseResponse = DBData [(TimeInterval, V.Vector Bar)] | DBError T.Text |
|
|
|
data DatabaseConfig = DatabaseConfig { |
|
dbHost :: T.Text, |
|
dbDatabase :: T.Text, |
|
dbUser :: T.Text, |
|
dbPassword :: T.Text |
|
} deriving (Show, Eq) |
|
|
|
data DatabaseInterface = DatabaseInterface { |
|
tid :: ThreadId, |
|
getData :: TickerId -> TimeInterval -> Timeframe -> IO [(TimeInterval, V.Vector Bar)], |
|
putData :: TickerId -> TimeInterval -> Timeframe -> V.Vector Bar -> IO () |
|
} |
|
|
|
startDatabase :: DatabaseConfig -> IO DatabaseInterface |
|
startDatabase config = do |
|
conn <- connectPostgreSQL (mkConnectionString config) |
|
cmdVar <- newEmptyMVar |
|
respVar <- newEmptyMVar |
|
tid <- forkFinally (dbThread conn cmdVar respVar) (cleanup conn cmdVar respVar) |
|
return DatabaseInterface { |
|
tid = tid, |
|
getData = doGetData cmdVar respVar, |
|
putData = doPutData cmdVar respVar } |
|
where |
|
mkConnectionString = undefined |
|
dbThread = undefined |
|
cleanup = undefined |
|
|
|
stopDatabase :: DatabaseInterface -> IO () |
|
stopDatabase db = undefined |
|
|
|
|
|
doGetData :: MVar DatabaseCommand -> MVar DatabaseResponse -> TickerId -> TimeInterval -> Timeframe -> IO [(TimeInterval, V.Vector Bar)] |
|
doGetData cmdVar respVar tickerId timeInterval timeframe = do |
|
putMVar cmdVar (DBGet tickerId timeInterval timeframe) |
|
resp <- takeMVar respVar |
|
case resp of |
|
DBData x -> return x |
|
DBError err -> do |
|
warningM "DB.Client" $ "Error while calling getData: " ++ show err |
|
return [] |
|
|
|
doPutData :: MVar DatabaseCommand -> MVar DatabaseResponse -> TickerId -> TimeInterval -> Timeframe -> V.Vector Bar -> IO () |
|
doPutData cmdVar respVar tickerId timeInterval timeframe bars = do |
|
putMVar cmdVar (DBPut tickerId timeInterval timeframe bars) |
|
resp <- takeMVar respVar |
|
case resp of |
|
DBData x -> return () |
|
DBError err -> do |
|
warningM "DB.Client" $ "Error while calling putData: " ++ show err |
|
return ()
|
|
|