@@ -52,7 +52,7 @@ import Database.PostgreSQL.Simple.FromRow (FromRow(..))
5252import Database.PostgreSQL.Simple.Types (Query (.. ))
5353import GHC.TypeLits (Symbol )
5454import Language.Haskell.TH.Syntax (Q , Dec (.. ), Exp (.. ), Type (.. ), Clause (.. ), Body (.. ), Pat (.. ))
55- import Language.Haskell.TH.Syntax (Name , mkName , newName , Lit (.. ), TyLit (.. ), TyVarBndr (.. ), lift )
55+ import Language.Haskell.TH.Syntax (Name , mkName , newName , Lit (.. ), TyLit (.. ), TyVarBndr (.. ))
5656import qualified Data.ByteString.Char8 as BS
5757
5858-- | Mapping from PostgreSQL types to Haskell types.
@@ -83,28 +83,28 @@ instance ToField Argument where
8383 toField (OptionalArg name _atype Nothing ) = throw . DefaultValueNotFound $ name
8484
8585
86- callExpression :: String
87- #ifdef OlderCallSyntax
88- callExpression = " := "
89- #else
90- callExpression = " => "
91- #endif
86+ untypedPlaceholder , typedPlaceholder :: String -> String
87+ untypedPlaceholder = const " ?"
88+ typedPlaceholder atype = " (?)::" ++ atype
89+
9290
93- formatArgument :: Bool -> Argument -> Maybe String
94- formatArgument cast = format where
91+ formatArgument :: String -> ( String -> String ) -> Argument -> Maybe String
92+ formatArgument callSyntax placeholder = format where
9593 format = \ case
9694 (MandatoryArg _name atype _value) -> Just $ placeholder atype
9795
9896 (OptionalArg name atype (Just _value)) -> Just . concat $ [
99- name , callExpression , placeholder atype]
97+ name, callSyntax , placeholder atype]
10098
10199 (OptionalArg _name _atype Nothing ) -> Nothing
102100
103- placeholder atype = if cast then (" (?)::" ++ atype) else " ?"
104101
102+ formatArguments :: String -> (String -> String ) -> [Argument ] -> String
103+ formatArguments callSyntax placeholder = concat
104+ . (intersperse " ," )
105+ . catMaybes
106+ . (map $ formatArgument callSyntax placeholder)
105107
106- formatArguments :: Bool -> [Argument ] -> String
107- formatArguments cast = concat . (intersperse " ," ) . catMaybes . (map $ formatArgument cast)
108108
109109filterArguments :: [Argument ] -> [Argument ]
110110filterArguments = filter isPresented where
@@ -204,17 +204,17 @@ traceIdWrapE = id
204204-- (PGFunction "public" "foo"
205205-- [PGArgument "x" "varchar" True, PGArgument "y" "bigint" False] (PGSingle "varchar"))
206206-- args -> { Query $ BS.pack $ concat ["select public.foo (", (formatArguments args), ")"] }
207- mkSqlQuery :: PostgresBindOptions -> PGFunction -> Maybe Name -> Q Exp
207+ mkSqlQuery :: PostgresBindOptions -> PGFunction -> Maybe Name -> Exp
208208mkSqlQuery opt (PGFunction schema fname _args ret) argsName =
209- lift (pboExplicitCasts opt) >>= \ cast ->
210- return . toQuery . traceIdWrapE . AppE ( VarE 'concat) . ListE $ [
211- mkStrLit $ concat [prefix opt, " " , functionName, " ( " ]
212- , maybe (mkStrLit " " ) ( \ args -> foldl1 AppE [
213- VarE 'formatArguments
214- , cast
215- , VarE args
216- ]) argsName
217- , mkStrLit " )" ] where
209+ toQuery . traceIdWrapE . AppE ( VarE 'concat) . ListE $ [
210+ mkStrLit $ concat [prefix opt, " " , functionName, " ( " ]
211+ , maybe ( mkStrLit " " ) ( \ args -> foldl1 AppE [
212+ VarE 'formatArguments
213+ , mkStrLit $ if (pboOlderCallSyntax opt) then " := " else " => "
214+ , VarE $ if (pboExplicitCasts opt) then 'typedPlaceholder else 'untypedPlaceholder
215+ , VarE args
216+ ]) argsName
217+ , mkStrLit " )" ] where
218218
219219 prefix (PostgresBindOptions {.. }) = case ret of
220220 PGTable _ -> mkSelect AsRow
@@ -274,11 +274,10 @@ mkFunctionE opt@(PostgresBindOptions {..}) f@(PGFunction _schema _fname args ret
274274
275275 let funcName = mkName $ pboFunctionName f
276276 let funcArgs = (VarP connName): (map VarP names)
277- sqlQuery <- mkSqlQuery opt f argsName
278277 let funcBody = NormalB $ unwrapE opt ret $ foldl1 AppE $ [
279278 VarE $ maybe 'query_ (const 'query) argsName
280279 , VarE connName
281- , sqlQuery
280+ , mkSqlQuery opt f argsName
282281 ] ++ (const (traceShowIdWrapE argsExpr) <$> maybeToList argsName)
283282
284283 let decl = (\ name -> ValD (VarP name) (NormalB argsExpr) [] ) <$> maybeToList argsName
0 commit comments