@@ -15,25 +15,24 @@ module Squeel.PostgreSQL.Value where
16import Control.Arrow (left)
16import Control.Arrow (left)
17import Data.Aeson (FromJSON, ToJSON, eitherDecodeStrict, encode)
17import Data.Aeson (FromJSON, ToJSON, eitherDecodeStrict, encode)
18−import Data.Bits (Bits)
19import Data.ByteString (ByteString)
18import Data.ByteString (ByteString)
20−import qualified Data.ByteString.Lazy as Lazy (ByteString, toStrict)
21import Data.Int (Int16,Int32,Int64)
19import Data.Int (Int16,Int32,Int64)
22import Data.Proxy
20import Data.Proxy
23import Data.Vinyl
21import Data.Vinyl
24import Data.Vinyl.Functor
22import Data.Vinyl.Functor
25import PostgreSQL.Binary.Decoder (Decoder)
23import PostgreSQL.Binary.Decoder (Decoder)
26−import qualified PostgreSQL.Binary.Decoder as Decoder
27import PostgreSQL.Binary.Encoder (Encoder)
24import PostgreSQL.Binary.Encoder (Encoder)
28−import qualified PostgreSQL.Binary.Encoder as Encoder
29import Data.Proxy (Proxy)
25import Data.Proxy (Proxy)
30import Data.Scientific (Scientific)
26import Data.Scientific (Scientific)
31import Data.Text (Text)
27import Data.Text (Text)
32import Data.Time (Day, TimeOfDay, TimeZone, LocalTime, UTCTime, DiffTime)
28import Data.Time (Day, TimeOfDay, TimeZone, LocalTime, UTCTime, DiffTime)
29+import Data.UUID (UUID)
31+import qualified Data.ByteString.Lazy as Lazy (ByteString, toStrict)
33import qualified Data.Text as Text (pack)
32import qualified Data.Text as Text (pack)
34import qualified Data.Text.Lazy as Lazy (Text)
33import qualified Data.Text.Lazy as Lazy (Text)
35−import Data.UUID (UUID)
34+import qualified PostgreSQL.Binary.Decoder as Decoder
36−import Data.Word (Word16, Word32, Word64)
35+import qualified PostgreSQL.Binary.Encoder as Encoder
38import Squeel.PostgreSQL.Type
37import Squeel.PostgreSQL.Type
@@ -42,94 +41,92 @@ decodeValue = Decoder.run . fromValue
43class FromValue (pg :: PGType) x where
42class FromValue (pg :: PGType) x where
44 fromValue :: Proxy pg -> Decoder x
43 fromValue :: Proxy pg -> Decoder x
45−instance (Integral x, Bits x) => FromValue ('PGType "int") x where
44+instance FromValue 'PGInt2 Int16 where
45+ fromValue _ = Decoder.int
46+instance FromValue 'PGInt4 Int32 where
47+ fromValue _ = Decoder.int
48+instance FromValue 'PGInt8 Int64 where
46 fromValue _ = Decoder.int
49 fromValue _ = Decoder.int
47−instance FromValue ('PGType "float4") Float where
50+instance FromValue 'PGFloat4 Float where
48 fromValue _ = Decoder.float4
51 fromValue _ = Decoder.float4
49−instance FromValue ('PGType "float8") Double where
52+instance FromValue 'PGFloat8 Double where
50 fromValue _ = Decoder.float8
53 fromValue _ = Decoder.float8
51−instance FromValue ('PGType "bool") Bool where
54+instance FromValue 'PGBool Bool where
52 fromValue _ = Decoder.bool
55 fromValue _ = Decoder.bool
53−instance FromValue ('PGType "bytea") ByteString where
56+instance FromValue 'PGBytea ByteString where
54 fromValue _ = Decoder.bytea_strict
57 fromValue _ = Decoder.bytea_strict
55−instance FromValue ('PGType "bytea") Lazy.ByteString where
58+instance FromValue 'PGBytea Lazy.ByteString where
56 fromValue _ = Decoder.bytea_lazy
59 fromValue _ = Decoder.bytea_lazy
57−instance FromValue ('PGType "text") Text where
60+instance FromValue 'PGText Text where
58 fromValue _ = Decoder.text_strict
61 fromValue _ = Decoder.text_strict
59−instance FromValue ('PGType "text") Lazy.Text where
62+instance FromValue 'PGText Lazy.Text where
60 fromValue _ = Decoder.text_lazy
63 fromValue _ = Decoder.text_lazy
61−instance FromValue ('PGType "char") Char where
64+instance FromValue ('PGChar 1) Char where
62 fromValue _ = Decoder.char
65 fromValue _ = Decoder.char
63−instance FromValue ('PGType "numeric") Scientific where
66+instance FromValue 'PGNumeric Scientific where
64 fromValue _ = Decoder.numeric
67 fromValue _ = Decoder.numeric
65−instance FromValue ('PGType "uuid") UUID where
68+instance FromValue 'PGUuid UUID where
66 fromValue _ = Decoder.uuid
69 fromValue _ = Decoder.uuid
67−instance FromJSON x => FromValue ('PGType "json") x where
70+instance FromJSON x => FromValue 'PGJson x where
68 fromValue _ = Decoder.json_bytes (left Text.pack . eitherDecodeStrict)
71 fromValue _ = Decoder.json_bytes (left Text.pack . eitherDecodeStrict)
69−instance FromJSON x => FromValue ('PGType "jsonb") x where
72+instance FromJSON x => FromValue 'PGJsonb x where
70 fromValue _ = Decoder.jsonb_bytes (left Text.pack . eitherDecodeStrict)
73 fromValue _ = Decoder.jsonb_bytes (left Text.pack . eitherDecodeStrict)
71−instance FromValue ('PGType "date") Day where
74+instance FromValue 'PGDate Day where
72 fromValue _ = Decoder.date
75 fromValue _ = Decoder.date
73−instance FromValue ('PGType "time") TimeOfDay where
76+instance FromValue 'PGTime TimeOfDay where
74 fromValue _ = Decoder.time_int
77 fromValue _ = Decoder.time_int
75−instance FromValue ('PGType "timetz") (TimeOfDay, TimeZone) where
78+instance FromValue 'PGTimeTZ (TimeOfDay, TimeZone) where
76 fromValue _ = Decoder.timetz_int
79 fromValue _ = Decoder.timetz_int
77−instance FromValue ('PGType "timestamp") LocalTime where
80+instance FromValue 'PGTimestamp LocalTime where
78 fromValue _ = Decoder.timestamp_int
81 fromValue _ = Decoder.timestamp_int
79−instance FromValue ('PGType "timestamptz") UTCTime where
82+instance FromValue 'PGTimestampTZ UTCTime where
80 fromValue _ = Decoder.timestamptz_int
83 fromValue _ = Decoder.timestamptz_int
81−instance FromValue ('PGType "interval") DiffTime where
84+instance FromValue 'PGInterval DiffTime where
82 fromValue _ = Decoder.interval_int
85 fromValue _ = Decoder.interval_int
84class ToValue x (pg :: PGType) where
87class ToValue x (pg :: PGType) where
85 toValue :: Proxy pg -> Encoder x
88 toValue :: Proxy pg -> Encoder x
86−instance ToValue Int16 ('PGType "int2") where
89+instance ToValue Int16 'PGInt2 where
87 toValue _ = Encoder.int2_int16
90 toValue _ = Encoder.int2_int16
88−instance ToValue Int32 ('PGType "int4") where
91+instance ToValue Int32 'PGInt4 where
89 toValue _ = Encoder.int4_int32
92 toValue _ = Encoder.int4_int32
90−instance ToValue Int64 ('PGType "int8") where
93+instance ToValue Int64 'PGInt8 where
91 toValue _ = Encoder.int8_int64
94 toValue _ = Encoder.int8_int64
92−instance ToValue Word16 ('PGType "word2") where
95+instance ToValue Float 'PGFloat4 where
93− toValue _ = Encoder.int2_word16
94−instance ToValue Word32 ('PGType "word4") where
95− toValue _ = Encoder.int4_word32
96−instance ToValue Word64 ('PGType "word8") where
97− toValue _ = Encoder.int8_word64
98−instance ToValue Float ('PGType "float4") where
99 toValue _ = Encoder.float4
96 toValue _ = Encoder.float4
100−instance ToValue Double ('PGType "float8") where
97+instance ToValue Double 'PGFloat8 where
101 toValue _ = Encoder.float8
98 toValue _ = Encoder.float8
102−instance ToValue Bool ('PGType "bool") where
99+instance ToValue Bool 'PGBool where
103 toValue _ = Encoder.bool
100 toValue _ = Encoder.bool
104−instance ToValue ByteString ('PGType "bytea") where
101+instance ToValue ByteString 'PGBytea where
105 toValue _ = Encoder.bytea_strict
102 toValue _ = Encoder.bytea_strict
106−instance ToValue Lazy.ByteString ('PGType "bytea") where
103+instance ToValue Lazy.ByteString 'PGBytea where
107 toValue _ = Encoder.bytea_lazy
104 toValue _ = Encoder.bytea_lazy
108−instance ToValue Text ('PGType "text") where
105+instance ToValue Text 'PGText where
109 toValue _ = Encoder.text_strict
106 toValue _ = Encoder.text_strict
110−instance ToValue Lazy.Text ('PGType "text") where
107+instance ToValue Lazy.Text 'PGText where
111 toValue _ = Encoder.text_lazy
108 toValue _ = Encoder.text_lazy
112−instance ToValue Char ('PGType "char") where
109+instance ToValue Char ('PGChar 1) where
113 toValue _ = Encoder.char
110 toValue _ = Encoder.char
114−instance ToValue Scientific ('PGType "numeric") where
111+instance ToValue Scientific 'PGNumeric where
115 toValue _ = Encoder.numeric
112 toValue _ = Encoder.numeric
116−instance ToValue UUID ('PGType "uuid") where
113+instance ToValue UUID 'PGUuid where
117 toValue _ = Encoder.uuid
114 toValue _ = Encoder.uuid
118−instance ToJSON x => ToValue x ('PGType "json") where
115+instance ToJSON x => ToValue x 'PGJson where
119 toValue _ = Encoder.json_bytes . Lazy.toStrict . encode
116 toValue _ = Encoder.json_bytes . Lazy.toStrict . encode
120−instance ToJSON x => ToValue x ('PGType "jsonb") where
117+instance ToJSON x => ToValue x 'PGJsonb where
121 toValue _ = Encoder.jsonb_bytes . Lazy.toStrict . encode
118 toValue _ = Encoder.jsonb_bytes . Lazy.toStrict . encode
122−instance ToValue Day ('PGType "date") where
119+instance ToValue Day 'PGDate where
123 toValue _ = Encoder.date
120 toValue _ = Encoder.date
124−instance ToValue TimeOfDay ('PGType "time") where
121+instance ToValue TimeOfDay 'PGTime where
125 toValue _ = Encoder.time_int
122 toValue _ = Encoder.time_int
126−instance ToValue (TimeOfDay, TimeZone) ('PGType "timetz") where
123+instance ToValue (TimeOfDay, TimeZone) 'PGTimeTZ where
127 toValue _ = Encoder.timetz_int
124 toValue _ = Encoder.timetz_int
128−instance ToValue LocalTime ('PGType "timestamp") where
125+instance ToValue LocalTime 'PGTimestamp where
129 toValue _ = Encoder.timestamp_int
126 toValue _ = Encoder.timestamp_int
130−instance ToValue UTCTime ('PGType "timestamptz") where
127+instance ToValue UTCTime 'PGTimestampTZ where
131 toValue _ = Encoder.timestamptz_int
128 toValue _ = Encoder.timestamptz_int
132−instance ToValue DiffTime ('PGType "interval") where
129+instance ToValue DiffTime 'PGInterval where
133 toValue _ = Encoder.interval_int
130 toValue _ = Encoder.interval_int
135class ToValues xs pgs where
132class ToValues xs pgs where