-- |
-- Specific IO Actions
module Main.IO where
import qualified Data.ByteString.Builder as ByteStringBuilder
import qualified Data.ByteString.Lazy as ByteStringLazy
import qualified Data.Scientific as Scientific
import qualified Data.Text.Encoding as Text
import qualified Data.UUID as UUID
import qualified Data.Vector as Vector
import qualified Database.PostgreSQL.LibPQ as LibPQ
import qualified Main.DB as DB
import qualified Main.PTI as PTI
import Main.Prelude hiding (assert, isLeft, isRight)
import qualified Main.TextEncoder as TextEncoder
import qualified PostgreSQL.Binary.Decoding as A
import qualified PostgreSQL.Binary.Encoding as B
import Test.QuickCheck
import Test.QuickCheck.Instances
textRoundtrip :: LibPQ.Oid -> TextEncoder.Encoder a -> (Bool -> A.Value a) -> a -> IO (Either Text a)
textRoundtrip oid encoder decoder value =
fmap (either (Left . Text.decodeUtf8) id) $
DB.session $ do
integerDatetimes <- DB.integerDatetimes
bytes <- DB.oneRow "SELECT $1" (params integerDatetimes) LibPQ.Binary
return $ A.valueParser (decoder integerDatetimes) bytes
where
params integerDatetimes =
[Just (oid, bytes, LibPQ.Text)]
where
bytes =
(ByteStringLazy.toStrict . ByteStringBuilder.toLazyByteString . encoder) value
roundtrip :: LibPQ.Oid -> (Bool -> a -> B.Encoding) -> (Bool -> A.Value b) -> a -> IO (Either Text b)
roundtrip oid encoder decoder value =
fmap (either (Left . Text.decodeUtf8) id) $
DB.session $ do
integerDatetimes <- DB.integerDatetimes
bytes <- DB.oneRow "SELECT $1" (params integerDatetimes) LibPQ.Binary
return $ A.valueParser (decoder integerDatetimes) bytes
where
params integerDatetimes =
[Just (oid, bytes, LibPQ.Binary)]
where
bytes =
(B.encodingBytes . encoder integerDatetimes) value
parameterlessStatement :: ByteString -> (Bool -> A.Value a) -> a -> IO (Either Text a)
parameterlessStatement statement decoder value =
fmap (either (Left . Text.decodeUtf8) id) $
DB.session $ do
integerDatetimes <- DB.integerDatetimes
bytes <- DB.oneRow statement [] LibPQ.Binary
return $ A.valueParser (decoder integerDatetimes) bytes