git.iko.soy/typeable/postgresql-simple
on master help sign in
add FromField/ToField instance declarations for ZonedTime
44de070rekado
src/Database/PostgreSQL/Simple/FromField.hs+14−1
@@ -54,7 +54,7 @@ import Data.Ratio (Ratio)
54import Data.Time.Calendar (Day, fromGregorian)
54import Data.Time.Calendar (Day, fromGregorian)
55import Data.Time.Clock (UTCTime)
55import Data.Time.Clock (UTCTime)
56import Data.Time.Format (parseTime)
56import Data.Time.Format (parseTime)
57−import Data.Time.LocalTime (TimeOfDay, makeTimeOfDayValid)
57+import Data.Time.LocalTime (ZonedTime, TimeOfDay, makeTimeOfDayValid)
58import Data.Typeable (Typeable, typeOf)
58import Data.Typeable (Typeable, typeOf)
59import Data.Word (Word64)
59import Data.Word (Word64)
60import Database.PostgreSQL.Simple.Internal
60import Database.PostgreSQL.Simple.Internal
@@ -209,6 +209,19 @@ instance FromField UTCTime where
209 Nothing -> returnError ConversionFailed f "could not parse"
209 Nothing -> returnError ConversionFailed f "could not parse"
210 where str = preprocess (B8.unpack bs)
210 where str = preprocess (B8.unpack bs)
211
211
212+instance FromField ZonedTime where
213+ fromField f =
214+ case oid2builtin (typeOid f) of
215+ Just TimestampWithTimeZone -> doIt "%F %T%Q%z" (++ "00")
216+ _ -> const $ returnError Incompatible f "types incompatible"
217+ where
218+ doIt _ _ Nothing = returnError UnexpectedNull f ""
219+ doIt fmt preprocess (Just bs) =
220+ case parseTime defaultTimeLocale fmt str of
221+ Just t -> pure t
222+ Nothing -> returnError ConversionFailed f "could not parse"
223+ where str = preprocess (B8.unpack bs)
224+
212instance FromField Day where
225instance FromField Day where
213 fromField f = atto ok date f
226 fromField f = atto ok date f
214 where ok = mkCompats [Date]
227 where ok = mkCompats [Date]
src/Database/PostgreSQL/Simple/ToField.hs+5−1
@@ -31,7 +31,7 @@ import Data.Monoid (mappend)
31import Data.Time.Calendar (Day, showGregorian)
31import Data.Time.Calendar (Day, showGregorian)
32import Data.Time.Clock (UTCTime)
32import Data.Time.Clock (UTCTime)
33import Data.Time.Format (formatTime)
33import Data.Time.Format (formatTime)
34−import Data.Time.LocalTime (TimeOfDay)
34+import Data.Time.LocalTime (TimeOfDay, ZonedTime)
35import Data.Typeable (Typeable)
35import Data.Typeable (Typeable)
36import Data.Word (Word, Word8, Word16, Word32, Word64)
36import Data.Word (Word, Word8, Word16, Word32, Word64)
37import Database.PostgreSQL.Simple.Types (Binary(..), In(..), Null)
37import Database.PostgreSQL.Simple.Types (Binary(..), In(..), Null)
@@ -191,6 +191,10 @@ instance ToField UTCTime where
191 toField = Plain . Utf8.fromString . formatTime defaultTimeLocale "'%F %T%Q+00'"
191 toField = Plain . Utf8.fromString . formatTime defaultTimeLocale "'%F %T%Q+00'"
192 {-# INLINE toField #-}
192 {-# INLINE toField #-}
193
193
194+instance ToField ZonedTime where
195+ toField = Plain . Utf8.fromString . formatTime defaultTimeLocale "'%F %T%Q%z'"
196+ {-# INLINE toField #-}
197+
194instance ToField Day where
198instance ToField Day where
195 toField = Plain . inQuotes . Utf8.fromString . showGregorian
199 toField = Plain . inQuotes . Utf8.fromString . showGregorian
196 {-# INLINE toField #-}
200 {-# INLINE toField #-}