{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Orville.PostgreSQL.Expr.Cursor
( DeclareExpr
, declare
, ScrollExpr
, scroll
, noScroll
, HoldExpr
, withHold
, withoutHold
, CloseExpr
, close
, AllCursors
, allCursors
, FetchExpr
, fetch
, MoveExpr
, move
, CursorDirection
, next
, prior
, first
, last
, absolute
, relative
, rowCount
, fetchAll
, forward
, forwardCount
, forwardAll
, backward
, backwardCount
, backwardAll
)
where
import Data.Maybe (catMaybes)
import Prelude (Either, Int, Maybe (Just), either, fmap, ($), (.), (<>))
import Orville.PostgreSQL.Expr.Name (CursorName)
import Orville.PostgreSQL.Expr.Query (QueryExpr)
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
newtype DeclareExpr
= DeclareExpr RawSql.RawSql
deriving
(
RawSql -> DeclareExpr
DeclareExpr -> RawSql
(DeclareExpr -> RawSql)
-> (RawSql -> DeclareExpr) -> SqlExpression DeclareExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: DeclareExpr -> RawSql
toRawSql :: DeclareExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> DeclareExpr
unsafeFromRawSql :: RawSql -> DeclareExpr
RawSql.SqlExpression
)
declare ::
CursorName ->
Maybe ScrollExpr ->
Maybe HoldExpr ->
QueryExpr ->
DeclareExpr
declare :: CursorName
-> Maybe ScrollExpr -> Maybe HoldExpr -> QueryExpr -> DeclareExpr
declare CursorName
cursorName Maybe ScrollExpr
maybeScrollExpr Maybe HoldExpr
maybeHoldExpr QueryExpr
queryExpr =
RawSql -> DeclareExpr
DeclareExpr (RawSql -> DeclareExpr) -> RawSql -> DeclareExpr
forall a b. (a -> b) -> a -> b
$
RawSql -> [RawSql] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.space ([RawSql] -> RawSql) -> [RawSql] -> RawSql
forall a b. (a -> b) -> a -> b
$
[Maybe RawSql] -> [RawSql]
forall a. [Maybe a] -> [a]
catMaybes
[ RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ String -> RawSql
RawSql.fromString String
"DECLARE"
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ CursorName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql CursorName
cursorName
, (ScrollExpr -> RawSql) -> Maybe ScrollExpr -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ScrollExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe ScrollExpr
maybeScrollExpr
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ String -> RawSql
RawSql.fromString String
"CURSOR"
, (HoldExpr -> RawSql) -> Maybe HoldExpr -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap HoldExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe HoldExpr
maybeHoldExpr
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ String -> RawSql
RawSql.fromString String
"FOR"
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ QueryExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql QueryExpr
queryExpr
]
newtype ScrollExpr
= ScrollExpr RawSql.RawSql
deriving
(
RawSql -> ScrollExpr
ScrollExpr -> RawSql
(ScrollExpr -> RawSql)
-> (RawSql -> ScrollExpr) -> SqlExpression ScrollExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: ScrollExpr -> RawSql
toRawSql :: ScrollExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> ScrollExpr
unsafeFromRawSql :: RawSql -> ScrollExpr
RawSql.SqlExpression
)
scroll :: ScrollExpr
scroll :: ScrollExpr
scroll =
RawSql -> ScrollExpr
ScrollExpr (RawSql -> ScrollExpr)
-> (String -> RawSql) -> String -> ScrollExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> ScrollExpr) -> String -> ScrollExpr
forall a b. (a -> b) -> a -> b
$ String
"SCROLL"
noScroll :: ScrollExpr
noScroll :: ScrollExpr
noScroll =
RawSql -> ScrollExpr
ScrollExpr (RawSql -> ScrollExpr)
-> (String -> RawSql) -> String -> ScrollExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> ScrollExpr) -> String -> ScrollExpr
forall a b. (a -> b) -> a -> b
$ String
"NO SCROLL"
newtype HoldExpr
= HoldExpr RawSql.RawSql
deriving
(
RawSql -> HoldExpr
HoldExpr -> RawSql
(HoldExpr -> RawSql)
-> (RawSql -> HoldExpr) -> SqlExpression HoldExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: HoldExpr -> RawSql
toRawSql :: HoldExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> HoldExpr
unsafeFromRawSql :: RawSql -> HoldExpr
RawSql.SqlExpression
)
withHold :: HoldExpr
withHold :: HoldExpr
withHold =
RawSql -> HoldExpr
HoldExpr (RawSql -> HoldExpr) -> (String -> RawSql) -> String -> HoldExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> HoldExpr) -> String -> HoldExpr
forall a b. (a -> b) -> a -> b
$ String
"WITH HOLD"
withoutHold :: HoldExpr
withoutHold :: HoldExpr
withoutHold =
RawSql -> HoldExpr
HoldExpr (RawSql -> HoldExpr) -> (String -> RawSql) -> String -> HoldExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> HoldExpr) -> String -> HoldExpr
forall a b. (a -> b) -> a -> b
$ String
"WITHOUT HOLD"
newtype CloseExpr
= CloseExpr RawSql.RawSql
deriving
(
RawSql -> CloseExpr
CloseExpr -> RawSql
(CloseExpr -> RawSql)
-> (RawSql -> CloseExpr) -> SqlExpression CloseExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: CloseExpr -> RawSql
toRawSql :: CloseExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> CloseExpr
unsafeFromRawSql :: RawSql -> CloseExpr
RawSql.SqlExpression
)
close :: Either AllCursors CursorName -> CloseExpr
close :: Either AllCursors CursorName -> CloseExpr
close Either AllCursors CursorName
allOrCursorName =
RawSql -> CloseExpr
CloseExpr (RawSql -> CloseExpr) -> RawSql -> CloseExpr
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"CLOSE "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> (AllCursors -> RawSql)
-> (CursorName -> RawSql) -> Either AllCursors CursorName -> RawSql
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either AllCursors -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql CursorName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Either AllCursors CursorName
allOrCursorName
newtype AllCursors
= AllCursors RawSql.RawSql
deriving
(
RawSql -> AllCursors
AllCursors -> RawSql
(AllCursors -> RawSql)
-> (RawSql -> AllCursors) -> SqlExpression AllCursors
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: AllCursors -> RawSql
toRawSql :: AllCursors -> RawSql
$cunsafeFromRawSql :: RawSql -> AllCursors
unsafeFromRawSql :: RawSql -> AllCursors
RawSql.SqlExpression
)
allCursors :: AllCursors
allCursors :: AllCursors
allCursors =
RawSql -> AllCursors
AllCursors (RawSql -> AllCursors)
-> (String -> RawSql) -> String -> AllCursors
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> AllCursors) -> String -> AllCursors
forall a b. (a -> b) -> a -> b
$ String
"ALL"
newtype FetchExpr
= FetchExpr RawSql.RawSql
deriving
(
RawSql -> FetchExpr
FetchExpr -> RawSql
(FetchExpr -> RawSql)
-> (RawSql -> FetchExpr) -> SqlExpression FetchExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: FetchExpr -> RawSql
toRawSql :: FetchExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> FetchExpr
unsafeFromRawSql :: RawSql -> FetchExpr
RawSql.SqlExpression
)
fetch :: Maybe CursorDirection -> CursorName -> FetchExpr
fetch :: Maybe CursorDirection -> CursorName -> FetchExpr
fetch Maybe CursorDirection
maybeDirection CursorName
cursorName =
RawSql -> FetchExpr
FetchExpr (RawSql -> FetchExpr) -> RawSql -> FetchExpr
forall a b. (a -> b) -> a -> b
$
RawSql -> [RawSql] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.space ([RawSql] -> RawSql) -> [RawSql] -> RawSql
forall a b. (a -> b) -> a -> b
$
[Maybe RawSql] -> [RawSql]
forall a. [Maybe a] -> [a]
catMaybes
[ RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ String -> RawSql
RawSql.fromString String
"FETCH"
, (CursorDirection -> RawSql)
-> Maybe CursorDirection -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CursorDirection -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe CursorDirection
maybeDirection
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ CursorName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql CursorName
cursorName
]
newtype MoveExpr
= MoveExpr RawSql.RawSql
deriving
(
RawSql -> MoveExpr
MoveExpr -> RawSql
(MoveExpr -> RawSql)
-> (RawSql -> MoveExpr) -> SqlExpression MoveExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: MoveExpr -> RawSql
toRawSql :: MoveExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> MoveExpr
unsafeFromRawSql :: RawSql -> MoveExpr
RawSql.SqlExpression
)
move :: Maybe CursorDirection -> CursorName -> MoveExpr
move :: Maybe CursorDirection -> CursorName -> MoveExpr
move Maybe CursorDirection
maybeDirection CursorName
cursorName =
RawSql -> MoveExpr
MoveExpr
(RawSql -> MoveExpr)
-> ([RawSql] -> RawSql) -> [RawSql] -> MoveExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawSql -> [RawSql] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.space
([RawSql] -> MoveExpr) -> [RawSql] -> MoveExpr
forall a b. (a -> b) -> a -> b
$ [Maybe RawSql] -> [RawSql]
forall a. [Maybe a] -> [a]
catMaybes
[ RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ String -> RawSql
RawSql.fromString String
"MOVE"
, (CursorDirection -> RawSql)
-> Maybe CursorDirection -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CursorDirection -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe CursorDirection
maybeDirection
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ CursorName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql CursorName
cursorName
]
newtype CursorDirection
= CursorDirection RawSql.RawSql
deriving
(
RawSql -> CursorDirection
CursorDirection -> RawSql
(CursorDirection -> RawSql)
-> (RawSql -> CursorDirection) -> SqlExpression CursorDirection
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: CursorDirection -> RawSql
toRawSql :: CursorDirection -> RawSql
$cunsafeFromRawSql :: RawSql -> CursorDirection
unsafeFromRawSql :: RawSql -> CursorDirection
RawSql.SqlExpression
)
next :: CursorDirection
next :: CursorDirection
next =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"NEXT"
prior :: CursorDirection
prior :: CursorDirection
prior =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"PRIOR"
first :: CursorDirection
first :: CursorDirection
first =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"FIRST"
last :: CursorDirection
last :: CursorDirection
last =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"LAST"
absolute :: Int -> CursorDirection
absolute :: Int -> CursorDirection
absolute Int
countParam =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection) -> RawSql -> CursorDirection
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"ABSOLUTE "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> Int -> RawSql
RawSql.intDecLiteral Int
countParam
relative :: Int -> CursorDirection
relative :: Int -> CursorDirection
relative Int
countParam =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection) -> RawSql -> CursorDirection
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"RELATIVE "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<>
Int -> RawSql
RawSql.intDecLiteral Int
countParam
rowCount :: Int -> CursorDirection
rowCount :: Int -> CursorDirection
rowCount Int
countParam =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection) -> RawSql -> CursorDirection
forall a b. (a -> b) -> a -> b
$
Int -> RawSql
RawSql.intDecLiteral Int
countParam
fetchAll :: CursorDirection
fetchAll :: CursorDirection
fetchAll =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"ALL"
forward :: CursorDirection
forward :: CursorDirection
forward =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"FORWARD"
forwardCount :: Int -> CursorDirection
forwardCount :: Int -> CursorDirection
forwardCount Int
countParam =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection) -> RawSql -> CursorDirection
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"FORWARD "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> Int -> RawSql
RawSql.intDecLiteral Int
countParam
forwardAll :: CursorDirection
forwardAll :: CursorDirection
forwardAll =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"FORWARD ALL"
backward :: CursorDirection
backward :: CursorDirection
backward =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"BACKWARD"
backwardCount :: Int -> CursorDirection
backwardCount :: Int -> CursorDirection
backwardCount Int
countParam =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection) -> RawSql -> CursorDirection
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"BACKWARD "
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> Int -> RawSql
RawSql.intDecLiteral Int
countParam
backwardAll :: CursorDirection
backwardAll :: CursorDirection
backwardAll =
RawSql -> CursorDirection
CursorDirection (RawSql -> CursorDirection)
-> (String -> RawSql) -> String -> CursorDirection
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> RawSql
RawSql.fromString (String -> CursorDirection) -> String -> CursorDirection
forall a b. (a -> b) -> a -> b
$ String
"BACKWARD ALL"