Skip to content

Commit df8a28f

Browse files
authored
Merge pull request #9 from MercuryTechnologies/tfausak/2025-07-11-persistent
Add Persistent instances
2 parents 8b985e4 + aa85e16 commit df8a28f

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ ghc.developPackage {
2020
pkgs.nixfmt-rfc-style
2121
pkgs.pkg-config
2222
pkgs.postgresql
23+
pkgs.zlib
2324
];
2425
}

postgresql-simple-interval.cabal

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@ common executable
6060
library
6161
import: library
6262
build-depends:
63+
persistent ^>=2.17,
6364
postgresql-simple ^>=0.7,
6465
scientific ^>=0.3.8,
66+
text >=1.2.4 && <1.3 || >=2.0 && <2.2,
6567

6668
-- cabal-gild: discover source/library
6769
exposed-modules:

source/library/Database/PostgreSQL/Simple/Interval/Unstable.hs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ import qualified Data.Attoparsec.ByteString.Char8 as A
99
import qualified Data.Bits as Bits
1010
import qualified Data.ByteString as ByteString
1111
import qualified Data.ByteString.Builder as Builder
12+
import qualified Data.ByteString.Char8 as Ascii
13+
import qualified Data.ByteString.Lazy as LazyByteString
1214
import qualified Data.Function as Function
1315
import qualified Data.Int as Int
1416
import 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
1520
import qualified Database.PostgreSQL.Simple.FromField as Postgres
1621
import qualified Database.PostgreSQL.Simple.ToField as Postgres
1722
import 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'@.
4651
instance 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

Comments
 (0)