module Database.PostgreSQL.Query.SqlBuilder.Types
(
SqlBuilderResult(..)
, builderResultPure
, FieldOption(..)
, LogMasker
, defaultLogMasker
, hugeFieldsMasker
) where
import Blaze.ByteString.Builder (Builder)
import Data.Semigroup
import Data.String
import Data.Typeable
import GHC.Generics (Generic)
import Language.Haskell.TH.Lift
import qualified Blaze.ByteString.Builder as BB
import qualified Data.ByteString as BS
data SqlBuilderResult = SqlBuilderResult
{ sbQueryString :: Builder
, sbLogString :: Builder
} deriving (Typeable, Generic)
instance Semigroup SqlBuilderResult where
(SqlBuilderResult a b) <> (SqlBuilderResult a' b') =
SqlBuilderResult (a <> a') (b <> b')
instance Monoid SqlBuilderResult where
mempty = SqlBuilderResult mempty mempty
mappend = (<>)
builderResultPure :: Builder -> SqlBuilderResult
builderResultPure b = SqlBuilderResult b b
data FieldOption
= FieldDefault
| FieldMasked
deriving (Eq, Ord, Show, Typeable, Generic)
deriveLift ''FieldOption
type LogMasker = FieldOption -> Builder -> Builder
defaultLogMasker :: LogMasker
defaultLogMasker FieldDefault bb = bb
defaultLogMasker FieldMasked _ = "'<MASKED BY POSTGRESQL-QUERY>'"
hugeFieldsMasker :: Int -> LogMasker
hugeFieldsMasker maxsize _ bb =
let bl = BS.length $ BB.toByteString bb
in if bl > maxsize
then fromString $ "'<STRING SIZE: " ++ show bl ++ " MASKED BY POSTGRESQL-QUERY>'"
else bb