module Database.PostgreSQL.PQTypes.Model.EnumType
( EnumType (..)
, sqlCreateEnum
, sqlDropEnum
) where
import Data.Monoid.Utils
import Data.Text qualified as T
import Database.PostgreSQL.PQTypes
data EnumType = EnumType
{ EnumType -> RawSQL ()
etName :: !(RawSQL ())
, EnumType -> [RawSQL ()]
etValues :: ![RawSQL ()]
}
deriving (EnumType -> EnumType -> Bool
(EnumType -> EnumType -> Bool)
-> (EnumType -> EnumType -> Bool) -> Eq EnumType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EnumType -> EnumType -> Bool
== :: EnumType -> EnumType -> Bool
$c/= :: EnumType -> EnumType -> Bool
/= :: EnumType -> EnumType -> Bool
Eq, Eq EnumType
Eq EnumType =>
(EnumType -> EnumType -> Ordering)
-> (EnumType -> EnumType -> Bool)
-> (EnumType -> EnumType -> Bool)
-> (EnumType -> EnumType -> Bool)
-> (EnumType -> EnumType -> Bool)
-> (EnumType -> EnumType -> EnumType)
-> (EnumType -> EnumType -> EnumType)
-> Ord EnumType
EnumType -> EnumType -> Bool
EnumType -> EnumType -> Ordering
EnumType -> EnumType -> EnumType
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: EnumType -> EnumType -> Ordering
compare :: EnumType -> EnumType -> Ordering
$c< :: EnumType -> EnumType -> Bool
< :: EnumType -> EnumType -> Bool
$c<= :: EnumType -> EnumType -> Bool
<= :: EnumType -> EnumType -> Bool
$c> :: EnumType -> EnumType -> Bool
> :: EnumType -> EnumType -> Bool
$c>= :: EnumType -> EnumType -> Bool
>= :: EnumType -> EnumType -> Bool
$cmax :: EnumType -> EnumType -> EnumType
max :: EnumType -> EnumType -> EnumType
$cmin :: EnumType -> EnumType -> EnumType
min :: EnumType -> EnumType -> EnumType
Ord, Int -> EnumType -> ShowS
[EnumType] -> ShowS
EnumType -> String
(Int -> EnumType -> ShowS)
-> (EnumType -> String) -> ([EnumType] -> ShowS) -> Show EnumType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EnumType -> ShowS
showsPrec :: Int -> EnumType -> ShowS
$cshow :: EnumType -> String
show :: EnumType -> String
$cshowList :: [EnumType] -> ShowS
showList :: [EnumType] -> ShowS
Show)
sqlCreateEnum :: EnumType -> RawSQL ()
sqlCreateEnum :: EnumType -> RawSQL ()
sqlCreateEnum EnumType {[RawSQL ()]
RawSQL ()
etName :: EnumType -> RawSQL ()
etValues :: EnumType -> [RawSQL ()]
etName :: RawSQL ()
etValues :: [RawSQL ()]
..} =
[RawSQL ()] -> RawSQL ()
forall m. (IsString m, Monoid m) => [m] -> m
smconcat
[ RawSQL ()
"CREATE TYPE"
, RawSQL ()
etName
, RawSQL ()
"AS ENUM ("
, RawSQL () -> [RawSQL ()] -> RawSQL ()
forall m. Monoid m => m -> [m] -> m
mintercalate RawSQL ()
", " ([RawSQL ()] -> RawSQL ()) -> [RawSQL ()] -> RawSQL ()
forall a b. (a -> b) -> a -> b
$ (RawSQL () -> RawSQL ()) -> [RawSQL ()] -> [RawSQL ()]
forall a b. (a -> b) -> [a] -> [b]
map RawSQL () -> RawSQL ()
quotedValue [RawSQL ()]
etValues
, RawSQL ()
")"
]
where
quotedValue :: RawSQL () -> RawSQL ()
quotedValue RawSQL ()
v = Text -> () -> RawSQL ()
forall row. (Show row, ToRow row) => Text -> row -> RawSQL row
rawSQL (Text
"'" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"'" Text
"''" (RawSQL () -> Text
unRawSQL RawSQL ()
v) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"'" :: T.Text) ()
sqlDropEnum :: RawSQL () -> RawSQL ()
sqlDropEnum :: RawSQL () -> RawSQL ()
sqlDropEnum = (RawSQL ()
"DROP TYPE" RawSQL () -> RawSQL () -> RawSQL ()
forall m. (IsString m, Monoid m) => m -> m -> m
<+>)