relational-query-0.12.2.0: src/Database/Relational/Internal/Literal.hs
-- |
-- Module : Database.Relational.Internal.Literal
-- Copyright : 2019 Kei Hibino
-- License : BSD3
--
-- Maintainer : ex8k.hibino@gmail.com
-- Stability : experimental
-- Portability : unknown
--
-- This module provides definitions to lift haskell expressions
-- into SQL expressions.
module Database.Relational.Internal.Literal (
stringExpr,
bool, integral, timestamp,
) where
import Data.Monoid ((<>))
import Data.Time (FormatTime, formatTime)
import Data.Time.Locale.Compat (defaultTimeLocale)
import Language.SQL.Keyword (Keyword)
import Database.Relational.Internal.String (StringSQL, stringSQL)
-- | Escape 'String' for constant SQL string expression.
escapeStringToSqlExpr :: String -> String
escapeStringToSqlExpr = rec where
rec "" = ""
rec ('\'':cs) = '\'' : '\'' : rec cs
rec (c:cs) = c : rec cs
-- | From 'String' into constant SQL string expression.
stringExpr :: String -> StringSQL
stringExpr = stringSQL . ('\'' :) . (++ "'") . escapeStringToSqlExpr
-- | SQL expressions for Bool type.
bool :: Bool -> StringSQL
bool =
stringSQL . d
where
d True = "(0=0)"
d False = "(0=1)"
-- | Constant integral SQL term.
integral :: (Show a, Integral a) => a -> StringSQL
integral = stringSQL . show
timestamp :: FormatTime t => Keyword -> String -> t -> StringSQL
timestamp kw fmt t = kw <> stringExpr (formatTime defaultTimeLocale fmt t)