@@ -9,9 +9,14 @@ import qualified Data.Attoparsec.ByteString.Char8 as A
99import qualified Data.Bits as Bits
1010import qualified Data.ByteString as ByteString
1111import qualified Data.ByteString.Builder as Builder
12+ import qualified Data.ByteString.Char8 as Ascii
13+ import qualified Data.ByteString.Lazy as LazyByteString
1214import qualified Data.Function as Function
1315import qualified Data.Int as Int
1416import qualified Data.Scientific as Scientific
17+ import qualified Data.Text as Text
18+ import qualified Database.Persist as Persist
19+ import qualified Database.Persist.Sql as Persist
1520import qualified Database.PostgreSQL.Simple.FromField as Postgres
1621import qualified Database.PostgreSQL.Simple.ToField as Postgres
1722import qualified Database.PostgreSQL.Simple.TypeInfo.Static as Postgres
@@ -44,7 +49,32 @@ instance Postgres.FromField Interval where
4449-- | Uses 'render'. Always includes an @interval@ prefix, like
4550-- @interval '\@ 0 mon -1 day +2 us'@.
4651instance Postgres. ToField Interval where
47- toField = Postgres. Plain . (" interval " <> ) . Postgres. inQuotes . render
52+ toField = Postgres. Plain . (" interval '" <> ) . (<> " '" ) . render
53+
54+ -- | Behaves the same as the 'Postgres.FromField' and 'Postgres.ToField'
55+ -- instances.
56+ instance Persist. PersistField Interval where
57+ fromPersistValue persistValue = case persistValue of
58+ Persist. PersistLiteralEscaped byteString
59+ | Right interval <- A. parseOnly parse byteString ->
60+ Right interval
61+ Persist. PersistLiteral byteString
62+ | Just withoutPrefix <- Ascii. stripPrefix " interval '" byteString,
63+ Just withoutSuffix <- Ascii. stripSuffix " '" withoutPrefix,
64+ Right interval <- A. parseOnly parse withoutSuffix ->
65+ Right interval
66+ _ -> Left $ " Invalid interval: " <> Text. pack (show persistValue)
67+ toPersistValue =
68+ Persist. PersistLiteral
69+ . LazyByteString. toStrict
70+ . Builder. toLazyByteString
71+ . (" interval '" <> )
72+ . (<> " '" )
73+ . render
74+
75+ -- | @'Persist.SqlOther' "interval"@
76+ instance Persist. PersistFieldSql Interval where
77+ sqlType = const $ Persist. SqlOther " interval"
4878
4979-- | The empty interval, representing no time at all.
5080--
0 commit comments