@@ -1,4 +1,4 @@
1−{-# LANGUAGE RecordWildCards #-}
1+{-# LANGUAGE RecordWildCards, FlexibleInstances #-}
22
33------------------------------------------------------------------------------
44-- |
@@ -23,8 +23,9 @@ module Database.PostgreSQL.Simple.FromRow
2323 , numFieldsRemaining
2424 ) where
2525
26−import Control.Applicative (Applicative(..), (<$>))
27−import Control.Monad (replicateM)
26+import Prelude hiding (null)
27+import Control.Applicative (Applicative(..), (<$>), (<|>), (*>))
28+import Control.Monad (replicateM, replicateM_)
2829import Data.ByteString (ByteString)
2930import qualified Data.ByteString.Char8 as B
3031import Data.Vector (Vector)
@@ -35,7 +36,7 @@ import Database.PostgreSQL.Simple.Internal
3536import Database.PostgreSQL.Simple.Compat
3637import Database.PostgreSQL.Simple.FromField
3738import Database.PostgreSQL.Simple.Ok
38−import Database.PostgreSQL.Simple.Types ((:.)(..))
39+import Database.PostgreSQL.Simple.Types ((:.)(..), Null)
3940import Database.PostgreSQL.Simple.TypeInfo
4041
4142import Control.Monad.Trans.State.Strict
@@ -120,62 +121,132 @@ numFieldsRemaining = RP $ do
120121 column <- lift get
121122 return $! (\(PQ.Col x) -> fromIntegral x) (nfields rowresult - column)
122123
124+null :: RowParser Null
125+null = field
126+
123127instance (FromField a) => FromRow (Only a) where
124128 fromRow = Only <$> field
125129
130+instance (FromField a) => FromRow (Maybe (Only a)) where
131+ fromRow = (null *> pure Nothing)
132+ <|> (Just <$> fromRow)
133+
126134instance (FromField a, FromField b) => FromRow (a,b) where
127135 fromRow = (,) <$> field <*> field
128136
137+instance (FromField a, FromField b) => FromRow (Maybe (a,b)) where
138+ fromRow = (null *> null *> pure Nothing)
139+ <|> (Just <$> fromRow)
140+
129141instance (FromField a, FromField b, FromField c) => FromRow (a,b,c) where
130142 fromRow = (,,) <$> field <*> field <*> field
131143
144+instance (FromField a, FromField b, FromField c) => FromRow (Maybe (a,b,c)) where
145+ fromRow = (null *> null *> null *> pure Nothing)
146+ <|> (Just <$> fromRow)
147+
132148instance (FromField a, FromField b, FromField c, FromField d) =>
133149 FromRow (a,b,c,d) where
134150 fromRow = (,,,) <$> field <*> field <*> field <*> field
135151
152+instance (FromField a, FromField b, FromField c, FromField d) =>
153+ FromRow (Maybe (a,b,c,d)) where
154+ fromRow = (null *> null *> null *> null *> pure Nothing)
155+ <|> (Just <$> fromRow)
156+
136157instance (FromField a, FromField b, FromField c, FromField d, FromField e) =>
137158 FromRow (a,b,c,d,e) where
138159 fromRow = (,,,,) <$> field <*> field <*> field <*> field <*> field
139160
161+instance (FromField a, FromField b, FromField c, FromField d, FromField e) =>
162+ FromRow (Maybe (a,b,c,d,e)) where
163+ fromRow = (null *> null *> null *> null *> null *> pure Nothing)
164+ <|> (Just <$> fromRow)
165+
140166instance (FromField a, FromField b, FromField c, FromField d, FromField e,
141167 FromField f) =>
142168 FromRow (a,b,c,d,e,f) where
143169 fromRow = (,,,,,) <$> field <*> field <*> field <*> field <*> field
144170 <*> field
145171
172+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
173+ FromField f) =>
174+ FromRow (Maybe (a,b,c,d,e,f)) where
175+ fromRow = (null *> null *> null *> null *> null *>
176+ null *> pure Nothing)
177+ <|> (Just <$> fromRow)
178+
146179instance (FromField a, FromField b, FromField c, FromField d, FromField e,
147180 FromField f, FromField g) =>
148181 FromRow (a,b,c,d,e,f,g) where
149182 fromRow = (,,,,,,) <$> field <*> field <*> field <*> field <*> field
150183 <*> field <*> field
151184
185+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
186+ FromField f, FromField g) =>
187+ FromRow (Maybe (a,b,c,d,e,f,g)) where
188+ fromRow = (null *> null *> null *> null *> null *>
189+ null *> null *> pure Nothing)
190+ <|> (Just <$> fromRow)
191+
152192instance (FromField a, FromField b, FromField c, FromField d, FromField e,
153193 FromField f, FromField g, FromField h) =>
154194 FromRow (a,b,c,d,e,f,g,h) where
155195 fromRow = (,,,,,,,) <$> field <*> field <*> field <*> field <*> field
156196 <*> field <*> field <*> field
157197
198+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
199+ FromField f, FromField g, FromField h) =>
200+ FromRow (Maybe (a,b,c,d,e,f,g,h)) where
201+ fromRow = (null *> null *> null *> null *> null *>
202+ null *> null *> null *> pure Nothing)
203+ <|> (Just <$> fromRow)
204+
158205instance (FromField a, FromField b, FromField c, FromField d, FromField e,
159206 FromField f, FromField g, FromField h, FromField i) =>
160207 FromRow (a,b,c,d,e,f,g,h,i) where
161208 fromRow = (,,,,,,,,) <$> field <*> field <*> field <*> field <*> field
162209 <*> field <*> field <*> field <*> field
163210
211+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
212+ FromField f, FromField g, FromField h, FromField i) =>
213+ FromRow (Maybe (a,b,c,d,e,f,g,h,i)) where
214+ fromRow = (null *> null *> null *> null *> null *>
215+ null *> null *> null *> null *> pure Nothing)
216+ <|> (Just <$> fromRow)
217+
164218instance (FromField a, FromField b, FromField c, FromField d, FromField e,
165219 FromField f, FromField g, FromField h, FromField i, FromField j) =>
166220 FromRow (a,b,c,d,e,f,g,h,i,j) where
167221 fromRow = (,,,,,,,,,) <$> field <*> field <*> field <*> field <*> field
168222 <*> field <*> field <*> field <*> field <*> field
169223
224+instance (FromField a, FromField b, FromField c, FromField d, FromField e,
225+ FromField f, FromField g, FromField h, FromField i, FromField j) =>
226+ FromRow (Maybe (a,b,c,d,e,f,g,h,i,j)) where
227+ fromRow = (null *> null *> null *> null *> null *>
228+ null *> null *> null *> null *> null *> pure Nothing)
229+ <|> (Just <$> fromRow)
230+
170231instance FromField a => FromRow [a] where
171232 fromRow = do
172233 n <- numFieldsRemaining
173234 replicateM n field
174235
236+instance FromField a => FromRow (Maybe [a]) where
237+ fromRow = do
238+ n <- numFieldsRemaining
239+ (replicateM_ n null *> pure Nothing) <|> (Just <$> replicateM n field)
240+
175241instance FromField a => FromRow (Vector a) where
176242 fromRow = do
177243 n <- numFieldsRemaining
178244 V.replicateM n field
179245
246+instance FromField a => FromRow (Maybe (Vector a)) where
247+ fromRow = do
248+ n <- numFieldsRemaining
249+ (replicateM_ n null *> pure Nothing) <|> (Just <$> V.replicateM n field)
250+
180251instance (FromRow a, FromRow b) => FromRow (a :. b) where
181252 fromRow = (:.) <$> fromRow <*> fromRow