mirror of
https://github.com/simplex-chat/simplexmq.git
synced 2026-08-14 05:00:08 +00:00
* postgres: implementation wip * to from field * agent store compiles * methods * create store * tests wip * migration tests pass * tests compile * fix tests * tests wip * bool int * tests wip * tests wip * more boolint * more fixes * more fields pass * more fixes * binary * instances, binary * test passes * remove todos, more tests pass * fix conflict * fix bool * fix sequence breaking * fix insertedRowId * skip ratchet re-synchronization tests * after test * file tests * after test * rename * remove comment * format * remove unused * suppress notices * fixes * move * fix * instance * instance2 * fix * instances * comment --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
64 lines
1.8 KiB
Haskell
64 lines
1.8 KiB
Haskell
{-# LANGUAGE ScopedTypeVariables #-}
|
|
|
|
module Simplex.Messaging.Agent.Store.Postgres.DB
|
|
( BoolInt (..),
|
|
PSQL.Binary (..),
|
|
PSQL.Connection,
|
|
PSQL.connect,
|
|
PSQL.close,
|
|
execute,
|
|
execute_,
|
|
executeMany,
|
|
PSQL.query,
|
|
PSQL.query_,
|
|
)
|
|
where
|
|
|
|
import Control.Monad (void)
|
|
import Data.Int (Int32, Int64)
|
|
import Data.Word (Word16, Word32)
|
|
import Database.PostgreSQL.Simple (ResultError (..))
|
|
import qualified Database.PostgreSQL.Simple as PSQL
|
|
import Database.PostgreSQL.Simple.FromField (FromField (..), returnError)
|
|
import Database.PostgreSQL.Simple.ToField (ToField (..))
|
|
|
|
newtype BoolInt = BI {unBI :: Bool}
|
|
|
|
instance FromField BoolInt where
|
|
fromField field dat = BI . (/= (0 :: Int)) <$> fromField field dat
|
|
{-# INLINE fromField #-}
|
|
|
|
instance ToField BoolInt where
|
|
toField (BI b) = toField ((if b then 1 else 0) :: Int)
|
|
{-# INLINE toField #-}
|
|
|
|
execute :: PSQL.ToRow q => PSQL.Connection -> PSQL.Query -> q -> IO ()
|
|
execute db q qs = void $ PSQL.execute db q qs
|
|
{-# INLINE execute #-}
|
|
|
|
execute_ :: PSQL.Connection -> PSQL.Query -> IO ()
|
|
execute_ db q = void $ PSQL.execute_ db q
|
|
{-# INLINE execute_ #-}
|
|
|
|
executeMany :: PSQL.ToRow q => PSQL.Connection -> PSQL.Query -> [q] -> IO ()
|
|
executeMany db q qs = void $ PSQL.executeMany db q qs
|
|
{-# INLINE executeMany #-}
|
|
|
|
-- orphan instances
|
|
|
|
-- used in FileSize
|
|
instance FromField Word32 where
|
|
fromField field dat = do
|
|
i <- fromField field dat
|
|
if i >= (0 :: Int64)
|
|
then pure (fromIntegral i :: Word32)
|
|
else returnError ConversionFailed field "Negative value can't be converted to Word32"
|
|
|
|
-- used in Version
|
|
instance FromField Word16 where
|
|
fromField field dat = do
|
|
i <- fromField field dat
|
|
if i >= (0 :: Int32)
|
|
then pure (fromIntegral i :: Word16)
|
|
else returnError ConversionFailed field "Negative value can't be converted to Word16"
|