Skip to content

Commit 5981e2c

Browse files
author
qz
committed
pgtype time support
1 parent f2ea8b7 commit 5981e2c

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

src/Database/PostgreSQL/Protocol/Codecs/Decoders.hs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ module Database.PostgreSQL.Protocol.Codecs.Decoders
1717
, bsJsonBytes
1818
, numeric
1919
, bsText
20+
, time
2021
, timestamp
2122
, timestamptz
2223
, uuid
@@ -28,7 +29,7 @@ import Data.ByteString (ByteString)
2829
import Data.Char (chr)
2930
import Data.Int (Int16, Int32, Int64)
3031
import Data.Scientific (Scientific)
31-
import Data.Time (Day, UTCTime, LocalTime, DiffTime)
32+
import Data.Time (Day, UTCTime, LocalTime, DiffTime, TimeOfDay)
3233
import Data.UUID (UUID, fromWords)
3334
import qualified Data.Vector as V
3435

@@ -164,6 +165,10 @@ numeric _ = do
164165
bsText :: FieldDecoder ByteString
165166
bsText = getByteString
166167

168+
{-# INLINE time #-}
169+
time :: FieldDecoder TimeOfDay
170+
time _ = mcsToTimeOfDay <$> getInt64BE
171+
167172
{-# INLINE timestamp #-}
168173
timestamp :: FieldDecoder LocalTime
169174
timestamp _ = microsToLocalTime <$> getInt64BE

src/Database/PostgreSQL/Protocol/Codecs/Encoders.hs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module Database.PostgreSQL.Protocol.Codecs.Encoders
1313
, bsJsonBytes
1414
, numeric
1515
, bsText
16+
, time
1617
, timestamp
1718
, timestamptz
1819
, uuid
@@ -23,7 +24,7 @@ import Data.Char (ord)
2324
import Data.Int (Int16, Int32, Int64)
2425
import Data.Monoid ((<>))
2526
import Data.Scientific (Scientific)
26-
import Data.Time (Day, UTCTime, LocalTime, DiffTime)
27+
import Data.Time (Day, UTCTime, LocalTime, DiffTime, TimeOfDay)
2728
import Data.UUID (UUID, toWords)
2829

2930
import Database.PostgreSQL.Protocol.Store.Encode
@@ -104,6 +105,10 @@ numeric n =
104105
bsText :: ByteString -> Encode
105106
bsText = putByteString
106107

108+
{-# INLINE time #-}
109+
time :: TimeOfDay -> Encode
110+
time = putInt64BE . timeOfDayToMcs
111+
107112
{-# INLINE timestamp #-}
108113
timestamp :: LocalTime -> Encode
109114
timestamp = putInt64BE . localTimeToMicros

src/Database/PostgreSQL/Protocol/Codecs/PgTypes.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module Database.PostgreSQL.Protocol.Codecs.PgTypes
1818
, jsonb
1919
, numeric
2020
, text
21+
, time
2122
, timestamp
2223
, timestamptz
2324
, uuid
@@ -88,6 +89,9 @@ numeric = mkOids 1700 1231
8889
text :: Oids
8990
text = mkOids 25 1009
9091

92+
time :: Oids
93+
time = mkOids 1083 1183
94+
9195
timestamp :: Oids
9296
timestamp = mkOids 1114 1115
9397

src/Database/PostgreSQL/Protocol/Codecs/Time.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ module Database.PostgreSQL.Protocol.Codecs.Time
22
( dayToPgj
33
, utcToMicros
44
, localTimeToMicros
5+
, timeOfDayToMcs
56
, pgjToDay
67
, microsToUTC
78
, microsToLocalTime
9+
, mcsToTimeOfDay
810
, intervalToDiffTime
911
, diffTimeToInterval
1012
) where

tests/Codecs/QuickCheck.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ testCodecsEncodeDecode = testGroup "Codecs property 'encode . decode = id'"
110110
(fmap JsonString <$> PD.bsJsonBytes)
111111
, mkCodecTest "numeric" PGT.numeric PE.numeric PD.numeric
112112
, mkCodecTest "text" PGT.text PE.bsText PD.bsText
113+
, mkCodecTest "time" PGT.time PE.time PD.time
113114
, mkCodecTest "timestamp" PGT.timestamp PE.timestamp PD.timestamp
114115
, mkCodecTest "timestamptz" PGT.timestamptz PE.timestamptz PD.timestamptz
115116
, mkCodecTest "uuid" PGT.uuid PE.uuid PD.uuid
@@ -174,6 +175,9 @@ instance Arbitrary Day where
174175
instance Arbitrary DiffTime where
175176
arbitrary = secondsToDiffTime <$> choose (0, 86400 - 1)
176177

178+
instance Arbitrary TimeOfDay where
179+
arbitrary = timeToTimeOfDay <$> arbitrary
180+
177181
instance Arbitrary LocalTime where
178182
arbitrary = LocalTime <$> arbitrary <*> fmap timeToTimeOfDay arbitrary
179183

0 commit comments

Comments
 (0)