{-# LANGUAGE NegativeLiterals #-} {-# LANGUAGE ScopedTypeVariables #-} module BinLogNew where import Control.Applicative import Control.Exception import Control.Monad import Data.Time.Clock.POSIX import Data.Time.Format import Data.Time.LocalTime import Database.MySQL.Base import Database.MySQL.BinLog import qualified System.IO.Streams as Stream import Test.Tasty.HUnit eventProducer :: IO () eventProducer = do c <- connect defaultConnectInfo {ciUser = "testMySQLHaskell", ciDatabase = "testMySQLHaskell"} execute_ c q1 execute_ c q2 execute_ c q3 return () tests :: MySQLConn -> Assertion tests c = do Just blt <- getLastBinLogTracker c x@(fd, _, _) <- dumpBinLog c 1002 blt False rowEventStream <- decodeRowBinLogEvent x let Just t = parseTimeM True defaultTimeLocale "%F %T%Q" "2016-08-08 17:25:59.1234" :: Maybe LocalTime z <- getCurrentTimeZone let timestamp = round $ utcTimeToPOSIXSeconds (localTimeToUTC z t) Just (RowUpdateEvent _ _ tme ue) <- Stream.read rowEventStream assertEqual "decode update event cloumn" (updateColumnCnt ue) 4 assertEqual "decode update event rows" (updateRowData ue) [ ( [ BinLogLong 0 , BinLogNull , BinLogNull , BinLogNull ], [ BinLogLong 0 , BinLogDateTime2 2016 8 8 17 25 59 120000 , BinLogTimeStamp2 timestamp 123400 , BinLogTime2 0 199 59 59 123456 ] ) ] Just (RowUpdateEvent _ _ tme ue) <- Stream.read rowEventStream assertEqual "decode update event rows" (updateRowData ue) [ ( [ BinLogLong 0 , BinLogDateTime2 2016 8 8 17 25 59 120000 , BinLogTimeStamp2 timestamp 123400 , BinLogTime2 0 199 59 59 123456 ], [ BinLogLong 0 , BinLogDateTime2 2016 8 8 17 25 59 100000 , BinLogTimeStamp2 timestamp 123000 , BinLogTime2 1 199 59 59 123450 ] ) ] Just (RowUpdateEvent _ _ tme ue) <- Stream.read rowEventStream assertEqual "decode update event rows" (updateRowData ue) [ ( [ BinLogLong 0 , BinLogDateTime2 2016 8 8 17 25 59 100000 , BinLogTimeStamp2 timestamp 123000 , BinLogTime2 1 199 59 59 123450 ], [ BinLogLong 0 , BinLogNull , BinLogNull , BinLogTime2 0 0 59 59 123450 ] ) ] q1 :: Query q1 = "UPDATE test_new SET \ \__datetime = '2016-08-08 17:25:59.12' ,\ \__timestamp = '2016-08-08 17:25:59.1234' ,\ \__time = '-199:59:59.123456' WHERE __id=0;" q2 :: Query q2 = "UPDATE test_new SET \ \__datetime = '2016-08-08 17:25:59.1' ,\ \__timestamp = '2016-08-08 17:25:59.123' ,\ \__time = '199:59:59.12345' WHERE __id=0;" q3 :: Query q3 = "UPDATE test_new SET \ \__datetime = null ,\ \__timestamp = null ,\ \__time = '-00:59:59.12345' WHERE __id=0;"