diff --git a/src/ATrade/MDS/Database.hs b/src/ATrade/MDS/Database.hs index 85614a0..84e541d 100644 --- a/src/ATrade/MDS/Database.hs +++ b/src/ATrade/MDS/Database.hs @@ -78,12 +78,13 @@ getData db tickerId interval@(TimeInterval start end) (Timeframe tfSec) = do putData :: MdsHandle -> TickerId -> TimeInterval -> Timeframe -> V.Vector Bar -> IO () putData db tickerId (TimeInterval start end) tf@(Timeframe tfSec) bars = do - delStmt <- prepare db "DELETE FROM bars WHERE timestamp >= ? AND timestamp <= ? AND ticker == ? AND timeframe == ?;" - void $ execute delStmt [(SqlPOSIXTime . utcTimeToPOSIXSeconds) start, (SqlPOSIXTime . utcTimeToPOSIXSeconds) end, (SqlString . T.unpack) tickerId, (SqlInteger . toInteger) tfSec] - stmt <- prepare db $ "INSERT INTO bars (ticker, timeframe, timestamp, open, high, low, close, volume)" ++ - " values (?, ?, ?, ?, ?, ?, ?, ?); " - executeMany stmt (map (barToSql tf) $ V.toList bars) - runRaw db "COMMIT;" + withTransaction db $ \db' -> do + delStmt <- prepare db' "DELETE FROM bars WHERE timestamp >= ? AND timestamp <= ? AND ticker == ? AND timeframe == ?;" + void $ execute delStmt [(SqlPOSIXTime . utcTimeToPOSIXSeconds) start, (SqlPOSIXTime . utcTimeToPOSIXSeconds) end, (SqlString . T.unpack) tickerId, (SqlInteger . toInteger) tfSec] + stmt <- prepare db' $ "INSERT INTO bars (ticker, timeframe, timestamp, open, high, low, close, volume)" ++ + " values (?, ?, ?, ?, ?, ?, ?, ?); " + executeMany stmt (map (barToSql tf) $ V.toList bars) + commit db' where barToSql :: Timeframe -> Bar -> [SqlValue] barToSql (Timeframe timeframeSecs) bar = [(SqlString . T.unpack . barSecurity) bar, diff --git a/src/ATrade/MDS/HistoryServer.hs b/src/ATrade/MDS/HistoryServer.hs index b5a86f8..4dbc6ab 100644 --- a/src/ATrade/MDS/HistoryServer.hs +++ b/src/ATrade/MDS/HistoryServer.hs @@ -84,6 +84,7 @@ serveHAP db sock = forever $ do handleCmd peerId rq bars = do debugM "HAP" $ "Incoming command: " ++ show rq putData db (hapTicker rq) (TimeInterval (hapStartTime rq) (hapEndTime rq)) (Timeframe $ hapTimeframeSec rq) (V.fromList bars) + debugM "HAP" $ "Data updated" sendMulti sock $ peerId :| B.empty : ["OK"] deserializeBars tickerId input =