Add RawField utility type

This commit is contained in:
2023-10-02 13:44:45 +02:00
parent 126b8ee6e9
commit 9628a4b57f
4 changed files with 41 additions and 8 deletions
+6 -4
View File
@@ -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
+15 -1
View File
@@ -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