Browse Source

DB: transactional update

master
Denis Tereshkin 6 years ago
parent
commit
eaea1449d4
  1. 13
      src/ATrade/MDS/Database.hs
  2. 1
      src/ATrade/MDS/HistoryServer.hs

13
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 :: MdsHandle -> TickerId -> TimeInterval -> Timeframe -> V.Vector Bar -> IO ()
putData db tickerId (TimeInterval start end) tf@(Timeframe tfSec) bars = do 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 == ?;" withTransaction db $ \db' -> do
void $ execute delStmt [(SqlPOSIXTime . utcTimeToPOSIXSeconds) start, (SqlPOSIXTime . utcTimeToPOSIXSeconds) end, (SqlString . T.unpack) tickerId, (SqlInteger . toInteger) tfSec] delStmt <- prepare db' "DELETE FROM bars WHERE timestamp >= ? AND timestamp <= ? AND ticker == ? AND timeframe == ?;"
stmt <- prepare db $ "INSERT INTO bars (ticker, timeframe, timestamp, open, high, low, close, volume)" ++ void $ execute delStmt [(SqlPOSIXTime . utcTimeToPOSIXSeconds) start, (SqlPOSIXTime . utcTimeToPOSIXSeconds) end, (SqlString . T.unpack) tickerId, (SqlInteger . toInteger) tfSec]
" values (?, ?, ?, ?, ?, ?, ?, ?); " stmt <- prepare db' $ "INSERT INTO bars (ticker, timeframe, timestamp, open, high, low, close, volume)" ++
executeMany stmt (map (barToSql tf) $ V.toList bars) " values (?, ?, ?, ?, ?, ?, ?, ?); "
runRaw db "COMMIT;" executeMany stmt (map (barToSql tf) $ V.toList bars)
commit db'
where where
barToSql :: Timeframe -> Bar -> [SqlValue] barToSql :: Timeframe -> Bar -> [SqlValue]
barToSql (Timeframe timeframeSecs) bar = [(SqlString . T.unpack . barSecurity) bar, barToSql (Timeframe timeframeSecs) bar = [(SqlString . T.unpack . barSecurity) bar,

1
src/ATrade/MDS/HistoryServer.hs

@ -84,6 +84,7 @@ serveHAP db sock = forever $ do
handleCmd peerId rq bars = do handleCmd peerId rq bars = do
debugM "HAP" $ "Incoming command: " ++ show rq debugM "HAP" $ "Incoming command: " ++ show rq
putData db (hapTicker rq) (TimeInterval (hapStartTime rq) (hapEndTime rq)) (Timeframe $ hapTimeframeSec rq) (V.fromList bars) 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"] sendMulti sock $ peerId :| B.empty : ["OK"]
deserializeBars tickerId input = deserializeBars tickerId input =

Loading…
Cancel
Save