Add RawField utility type
This commit is contained in:
@@ -15,6 +15,7 @@ module Database.PostgreSQL.Opium
|
||||
, ErrorPosition (..)
|
||||
, FromField (..)
|
||||
, FromRow (..)
|
||||
, RawField (..)
|
||||
, fetch_
|
||||
, toListColumnTable
|
||||
)
|
||||
@@ -43,11 +44,12 @@ import qualified Data.Vector as Vector
|
||||
import qualified Database.PostgreSQL.LibPQ as LibPQ
|
||||
|
||||
import Database.PostgreSQL.Opium.Error (Error (..), ErrorPosition (..))
|
||||
import Database.PostgreSQL.Opium.FromField (FromField (..), fromField)
|
||||
import Database.PostgreSQL.Opium.FromField (FromField (..), fromField, RawField (..))
|
||||
|
||||
execParams :: Connection -> ByteString -> ExceptT Error IO Result
|
||||
execParams :: Connection -> Text -> ExceptT Error IO Result
|
||||
execParams conn query = do
|
||||
liftIO (LibPQ.execParams conn query [] LibPQ.Binary) >>= \case
|
||||
let queryBytes = Encoding.encodeUtf8 query
|
||||
liftIO (LibPQ.execParams conn queryBytes [] LibPQ.Binary) >>= \case
|
||||
Nothing ->
|
||||
except $ Left ErrorNoResult
|
||||
Just result -> do
|
||||
@@ -58,7 +60,7 @@ execParams conn query = do
|
||||
Nothing -> pure result
|
||||
Just message -> except $ Left $ ErrorInvalidResult status $ Encoding.decodeUtf8 message
|
||||
|
||||
fetch_ :: forall a. FromRow a => Connection -> ByteString -> IO (Either Error [a])
|
||||
fetch_ :: forall a. FromRow a => Connection -> Text -> IO (Either Error [a])
|
||||
fetch_ conn query = runExceptT $ do
|
||||
result <- execParams conn query
|
||||
columnTable <- ExceptT $ getColumnTable @a Proxy result
|
||||
|
||||
@@ -3,8 +3,11 @@
|
||||
{-# LANGUAGE TypeApplications #-}
|
||||
|
||||
module Database.PostgreSQL.Opium.FromField
|
||||
( FromField (..)
|
||||
( -- * Decoding data from @libpq@
|
||||
FromField (..)
|
||||
, fromField
|
||||
-- * Utility types
|
||||
, RawField (..)
|
||||
) where
|
||||
|
||||
import Data.Attoparsec.ByteString (Parser)
|
||||
@@ -37,15 +40,19 @@ class FromField a where
|
||||
validOid :: Proxy a -> Oid -> Bool
|
||||
parseField :: Parser a
|
||||
|
||||
-- | See https://www.postgresql.org/docs/current/datatype-binary.html.
|
||||
-- Accepts @bytea@.
|
||||
instance FromField ByteString where
|
||||
validOid Proxy = Oid.bytea
|
||||
parseField = AP.takeByteString
|
||||
|
||||
-- | See https://www.postgresql.org/docs/current/datatype-character.html.
|
||||
-- Accepts @text@, @character@ and @character varying@.
|
||||
instance FromField Text where
|
||||
validOid Proxy = Oid.text \/ Oid.character \/ Oid.characterVarying
|
||||
parseField = Encoding.decodeUtf8 <$> AP.takeByteString
|
||||
|
||||
-- Accepts @text@, @character@ and @character varying@.
|
||||
-- | See https://www.postgresql.org/docs/current/datatype-character.html.
|
||||
instance FromField String where
|
||||
validOid Proxy = validOid @Text Proxy
|
||||
@@ -117,3 +124,10 @@ instance FromField Day where
|
||||
parseField = fromJulianDay . fromIntegral <$> intParser @Int32
|
||||
where
|
||||
fromJulianDay x = ModifiedJulianDay $ x + 51544
|
||||
|
||||
newtype RawField = RawField ByteString
|
||||
deriving (Eq, Show)
|
||||
|
||||
instance FromField RawField where
|
||||
validOid Proxy = const True
|
||||
parseField = RawField <$> AP.takeByteString
|
||||
|
||||
Reference in New Issue
Block a user