@@ -74,10 +74,10 @@ ff :: PG.BuiltinType -> String -> (B.ByteString -> Either String a)
74ff pgType hsType parse f mstr
74ff pgType hsType parse f mstr
75 | typeOid f /= PG.builtin2oid pgType
75 | typeOid f /= PG.builtin2oid pgType
76 = left (Incompatible (B8.unpack (typename f)) hsType "")
76 = left (Incompatible (B8.unpack (typename f)) hsType "")
77− | Nothing <- mstr
77+ | Nothing <- mstr
78 = left (UnexpectedNull (B8.unpack (typename f)) hsType "")
78 = left (UnexpectedNull (B8.unpack (typename f)) hsType "")
79− | Just str <- mstr
79+ | Just str <- mstr
80− = case parse str of
80+ = case parse str of
81 Left msg -> left (ConversionFailed (B8.unpack (typename f)) hsType msg)
81 Left msg -> left (ConversionFailed (B8.unpack (typename f)) hsType msg)
82 Right val -> pure val
82 Right val -> pure val
83{-# INLINE ff #-}
83{-# INLINE ff #-}
@@ -122,8 +122,9 @@ getDay = do
122getDate :: A.Parser Date
122getDate :: A.Parser Date
123getDate = getUnbounded getDay
123getDate = getUnbounded getDay
125−toPicos :: Num a => B.ByteString -> a
125+decimal :: Fractional a => B.ByteString -> a
126−toPicos str = toNum str * 10^(12 - B.length str)
126+decimal str = toNum str / 10^(B.length str)
127+{-# INLINE decimal #-}
128getTimeOfDay :: A.Parser TimeOfDay
129getTimeOfDay :: A.Parser TimeOfDay
129getTimeOfDay = do
130getTimeOfDay = do
@@ -132,9 +133,9 @@ getTimeOfDay = do
132 minute <- digits "minutes"
133 minute <- digits "minutes"
133 _ <- A.char ':'
134 _ <- A.char ':'
134 second <- digits "seconds"
135 second <- digits "seconds"
135− picos <- (A.char '.' *> (toPicos <$> A.takeWhile1 isDigit)) <|> return 0
136+ subsec <- (A.char '.' *> (decimal <$> A.takeWhile1 isDigit)) <|> return 0
137− let !picos' = second * 1000000000000 + picos
138+ let !picos' = second + subsec
139 case makeTimeOfDayValid hour minute picos' of
140 case makeTimeOfDayValid hour minute picos' of
140 Nothing -> fail "invalid time of day"
141 Nothing -> fail "invalid time of day"
@@ -165,7 +166,7 @@ getUTCTime = do
165 _ <- A.char ' '
166 _ <- A.char ' '
166 time <- getTimeOfDay
167 time <- getTimeOfDay
167 zone <- getTimeZone
168 zone <- getTimeZone
168− let (!dayDelta,!time') = utcToLocalTimeOfDay zone time
169+ let (!dayDelta,!time') = localToUTCTimeOfDay zone time
169 let !day' = addDays dayDelta day
170 let !day' = addDays dayDelta day
170 let !time'' = timeOfDayToTime time'
171 let !time'' = timeOfDayToTime time'
171 return (UTCTime day' time'')
172 return (UTCTime day' time'')