module Database.PostgreSQL.PQTypes.Cursor
( CursorName(..)
, Scroll(..)
, Hold(..)
, Cursor
, CursorDirection(..)
, cursorName
, cursorQuery
, withCursor
, withCursorSQL
, cursorFetch
, cursorFetch_
, cursorMove
, cursorMove_
) where
import Control.Monad
import Control.Monad.Catch
import Data.String
import Data.Monoid.Utils
import Database.PostgreSQL.PQTypes.Class
import Database.PostgreSQL.PQTypes.SQL
import Database.PostgreSQL.PQTypes.SQL.Class
import Database.PostgreSQL.PQTypes.Utils
newtype CursorName sql = CursorName { CursorName sql -> sql
unCursorName :: sql }
deriving (CursorName sql -> CursorName sql -> Bool
(CursorName sql -> CursorName sql -> Bool)
-> (CursorName sql -> CursorName sql -> Bool)
-> Eq (CursorName sql)
forall sql. Eq sql => CursorName sql -> CursorName sql -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CursorName sql -> CursorName sql -> Bool
$c/= :: forall sql. Eq sql => CursorName sql -> CursorName sql -> Bool
== :: CursorName sql -> CursorName sql -> Bool
$c== :: forall sql. Eq sql => CursorName sql -> CursorName sql -> Bool
Eq, Eq (CursorName sql)
Eq (CursorName sql)
-> (CursorName sql -> CursorName sql -> Ordering)
-> (CursorName sql -> CursorName sql -> Bool)
-> (CursorName sql -> CursorName sql -> Bool)
-> (CursorName sql -> CursorName sql -> Bool)
-> (CursorName sql -> CursorName sql -> Bool)
-> (CursorName sql -> CursorName sql -> CursorName sql)
-> (CursorName sql -> CursorName sql -> CursorName sql)
-> Ord (CursorName sql)
CursorName sql -> CursorName sql -> Bool
CursorName sql -> CursorName sql -> Ordering
CursorName sql -> CursorName sql -> CursorName sql
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
forall sql. Ord sql => Eq (CursorName sql)
forall sql. Ord sql => CursorName sql -> CursorName sql -> Bool
forall sql. Ord sql => CursorName sql -> CursorName sql -> Ordering
forall sql.
Ord sql =>
CursorName sql -> CursorName sql -> CursorName sql
min :: CursorName sql -> CursorName sql -> CursorName sql
$cmin :: forall sql.
Ord sql =>
CursorName sql -> CursorName sql -> CursorName sql
max :: CursorName sql -> CursorName sql -> CursorName sql
$cmax :: forall sql.
Ord sql =>
CursorName sql -> CursorName sql -> CursorName sql
>= :: CursorName sql -> CursorName sql -> Bool
$c>= :: forall sql. Ord sql => CursorName sql -> CursorName sql -> Bool
> :: CursorName sql -> CursorName sql -> Bool
$c> :: forall sql. Ord sql => CursorName sql -> CursorName sql -> Bool
<= :: CursorName sql -> CursorName sql -> Bool
$c<= :: forall sql. Ord sql => CursorName sql -> CursorName sql -> Bool
< :: CursorName sql -> CursorName sql -> Bool
$c< :: forall sql. Ord sql => CursorName sql -> CursorName sql -> Bool
compare :: CursorName sql -> CursorName sql -> Ordering
$ccompare :: forall sql. Ord sql => CursorName sql -> CursorName sql -> Ordering
$cp1Ord :: forall sql. Ord sql => Eq (CursorName sql)
Ord)
instance IsString sql => IsString (CursorName sql) where
fromString :: String -> CursorName sql
fromString = sql -> CursorName sql
forall sql. sql -> CursorName sql
CursorName (sql -> CursorName sql)
-> (String -> sql) -> String -> CursorName sql
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> sql
forall a. IsString a => String -> a
fromString
instance Show sql => Show (CursorName sql) where
showsPrec :: Int -> CursorName sql -> ShowS
showsPrec Int
n (CursorName sql
name) = (String
"Cursor " String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> sql -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
n sql
name
data Scroll = Scroll | NoScroll
deriving (Scroll -> Scroll -> Bool
(Scroll -> Scroll -> Bool)
-> (Scroll -> Scroll -> Bool) -> Eq Scroll
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Scroll -> Scroll -> Bool
$c/= :: Scroll -> Scroll -> Bool
== :: Scroll -> Scroll -> Bool
$c== :: Scroll -> Scroll -> Bool
Eq, Eq Scroll
Eq Scroll
-> (Scroll -> Scroll -> Ordering)
-> (Scroll -> Scroll -> Bool)
-> (Scroll -> Scroll -> Bool)
-> (Scroll -> Scroll -> Bool)
-> (Scroll -> Scroll -> Bool)
-> (Scroll -> Scroll -> Scroll)
-> (Scroll -> Scroll -> Scroll)
-> Ord Scroll
Scroll -> Scroll -> Bool
Scroll -> Scroll -> Ordering
Scroll -> Scroll -> Scroll
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
min :: Scroll -> Scroll -> Scroll
$cmin :: Scroll -> Scroll -> Scroll
max :: Scroll -> Scroll -> Scroll
$cmax :: Scroll -> Scroll -> Scroll
>= :: Scroll -> Scroll -> Bool
$c>= :: Scroll -> Scroll -> Bool
> :: Scroll -> Scroll -> Bool
$c> :: Scroll -> Scroll -> Bool
<= :: Scroll -> Scroll -> Bool
$c<= :: Scroll -> Scroll -> Bool
< :: Scroll -> Scroll -> Bool
$c< :: Scroll -> Scroll -> Bool
compare :: Scroll -> Scroll -> Ordering
$ccompare :: Scroll -> Scroll -> Ordering
$cp1Ord :: Eq Scroll
Ord, Int -> Scroll -> ShowS
[Scroll] -> ShowS
Scroll -> String
(Int -> Scroll -> ShowS)
-> (Scroll -> String) -> ([Scroll] -> ShowS) -> Show Scroll
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Scroll] -> ShowS
$cshowList :: [Scroll] -> ShowS
show :: Scroll -> String
$cshow :: Scroll -> String
showsPrec :: Int -> Scroll -> ShowS
$cshowsPrec :: Int -> Scroll -> ShowS
Show)
data Hold = Hold | NoHold
deriving (Hold -> Hold -> Bool
(Hold -> Hold -> Bool) -> (Hold -> Hold -> Bool) -> Eq Hold
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Hold -> Hold -> Bool
$c/= :: Hold -> Hold -> Bool
== :: Hold -> Hold -> Bool
$c== :: Hold -> Hold -> Bool
Eq, Eq Hold
Eq Hold
-> (Hold -> Hold -> Ordering)
-> (Hold -> Hold -> Bool)
-> (Hold -> Hold -> Bool)
-> (Hold -> Hold -> Bool)
-> (Hold -> Hold -> Bool)
-> (Hold -> Hold -> Hold)
-> (Hold -> Hold -> Hold)
-> Ord Hold
Hold -> Hold -> Bool
Hold -> Hold -> Ordering
Hold -> Hold -> Hold
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
min :: Hold -> Hold -> Hold
$cmin :: Hold -> Hold -> Hold
max :: Hold -> Hold -> Hold
$cmax :: Hold -> Hold -> Hold
>= :: Hold -> Hold -> Bool
$c>= :: Hold -> Hold -> Bool
> :: Hold -> Hold -> Bool
$c> :: Hold -> Hold -> Bool
<= :: Hold -> Hold -> Bool
$c<= :: Hold -> Hold -> Bool
< :: Hold -> Hold -> Bool
$c< :: Hold -> Hold -> Bool
compare :: Hold -> Hold -> Ordering
$ccompare :: Hold -> Hold -> Ordering
$cp1Ord :: Eq Hold
Ord, Int -> Hold -> ShowS
[Hold] -> ShowS
Hold -> String
(Int -> Hold -> ShowS)
-> (Hold -> String) -> ([Hold] -> ShowS) -> Show Hold
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Hold] -> ShowS
$cshowList :: [Hold] -> ShowS
show :: Hold -> String
$cshow :: Hold -> String
showsPrec :: Int -> Hold -> ShowS
$cshowsPrec :: Int -> Hold -> ShowS
Show)
data Cursor sql = Cursor !(CursorName sql) !sql
deriving (Cursor sql -> Cursor sql -> Bool
(Cursor sql -> Cursor sql -> Bool)
-> (Cursor sql -> Cursor sql -> Bool) -> Eq (Cursor sql)
forall sql. Eq sql => Cursor sql -> Cursor sql -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Cursor sql -> Cursor sql -> Bool
$c/= :: forall sql. Eq sql => Cursor sql -> Cursor sql -> Bool
== :: Cursor sql -> Cursor sql -> Bool
$c== :: forall sql. Eq sql => Cursor sql -> Cursor sql -> Bool
Eq, Eq (Cursor sql)
Eq (Cursor sql)
-> (Cursor sql -> Cursor sql -> Ordering)
-> (Cursor sql -> Cursor sql -> Bool)
-> (Cursor sql -> Cursor sql -> Bool)
-> (Cursor sql -> Cursor sql -> Bool)
-> (Cursor sql -> Cursor sql -> Bool)
-> (Cursor sql -> Cursor sql -> Cursor sql)
-> (Cursor sql -> Cursor sql -> Cursor sql)
-> Ord (Cursor sql)
Cursor sql -> Cursor sql -> Bool
Cursor sql -> Cursor sql -> Ordering
Cursor sql -> Cursor sql -> Cursor sql
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
forall sql. Ord sql => Eq (Cursor sql)
forall sql. Ord sql => Cursor sql -> Cursor sql -> Bool
forall sql. Ord sql => Cursor sql -> Cursor sql -> Ordering
forall sql. Ord sql => Cursor sql -> Cursor sql -> Cursor sql
min :: Cursor sql -> Cursor sql -> Cursor sql
$cmin :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Cursor sql
max :: Cursor sql -> Cursor sql -> Cursor sql
$cmax :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Cursor sql
>= :: Cursor sql -> Cursor sql -> Bool
$c>= :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Bool
> :: Cursor sql -> Cursor sql -> Bool
$c> :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Bool
<= :: Cursor sql -> Cursor sql -> Bool
$c<= :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Bool
< :: Cursor sql -> Cursor sql -> Bool
$c< :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Bool
compare :: Cursor sql -> Cursor sql -> Ordering
$ccompare :: forall sql. Ord sql => Cursor sql -> Cursor sql -> Ordering
$cp1Ord :: forall sql. Ord sql => Eq (Cursor sql)
Ord, Int -> Cursor sql -> ShowS
[Cursor sql] -> ShowS
Cursor sql -> String
(Int -> Cursor sql -> ShowS)
-> (Cursor sql -> String)
-> ([Cursor sql] -> ShowS)
-> Show (Cursor sql)
forall sql. Show sql => Int -> Cursor sql -> ShowS
forall sql. Show sql => [Cursor sql] -> ShowS
forall sql. Show sql => Cursor sql -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Cursor sql] -> ShowS
$cshowList :: forall sql. Show sql => [Cursor sql] -> ShowS
show :: Cursor sql -> String
$cshow :: forall sql. Show sql => Cursor sql -> String
showsPrec :: Int -> Cursor sql -> ShowS
$cshowsPrec :: forall sql. Show sql => Int -> Cursor sql -> ShowS
Show)
data CursorDirection
= CD_Next
| CD_Prior
| CD_First
| CD_Last
| CD_Forward_All
| CD_Backward_All
| CD_Absolute Int
| CD_Relative Int
| CD_Forward Int
| CD_Backward Int
deriving (CursorDirection -> CursorDirection -> Bool
(CursorDirection -> CursorDirection -> Bool)
-> (CursorDirection -> CursorDirection -> Bool)
-> Eq CursorDirection
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CursorDirection -> CursorDirection -> Bool
$c/= :: CursorDirection -> CursorDirection -> Bool
== :: CursorDirection -> CursorDirection -> Bool
$c== :: CursorDirection -> CursorDirection -> Bool
Eq, Eq CursorDirection
Eq CursorDirection
-> (CursorDirection -> CursorDirection -> Ordering)
-> (CursorDirection -> CursorDirection -> Bool)
-> (CursorDirection -> CursorDirection -> Bool)
-> (CursorDirection -> CursorDirection -> Bool)
-> (CursorDirection -> CursorDirection -> Bool)
-> (CursorDirection -> CursorDirection -> CursorDirection)
-> (CursorDirection -> CursorDirection -> CursorDirection)
-> Ord CursorDirection
CursorDirection -> CursorDirection -> Bool
CursorDirection -> CursorDirection -> Ordering
CursorDirection -> CursorDirection -> CursorDirection
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
min :: CursorDirection -> CursorDirection -> CursorDirection
$cmin :: CursorDirection -> CursorDirection -> CursorDirection
max :: CursorDirection -> CursorDirection -> CursorDirection
$cmax :: CursorDirection -> CursorDirection -> CursorDirection
>= :: CursorDirection -> CursorDirection -> Bool
$c>= :: CursorDirection -> CursorDirection -> Bool
> :: CursorDirection -> CursorDirection -> Bool
$c> :: CursorDirection -> CursorDirection -> Bool
<= :: CursorDirection -> CursorDirection -> Bool
$c<= :: CursorDirection -> CursorDirection -> Bool
< :: CursorDirection -> CursorDirection -> Bool
$c< :: CursorDirection -> CursorDirection -> Bool
compare :: CursorDirection -> CursorDirection -> Ordering
$ccompare :: CursorDirection -> CursorDirection -> Ordering
$cp1Ord :: Eq CursorDirection
Ord, Int -> CursorDirection -> ShowS
[CursorDirection] -> ShowS
CursorDirection -> String
(Int -> CursorDirection -> ShowS)
-> (CursorDirection -> String)
-> ([CursorDirection] -> ShowS)
-> Show CursorDirection
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CursorDirection] -> ShowS
$cshowList :: [CursorDirection] -> ShowS
show :: CursorDirection -> String
$cshow :: CursorDirection -> String
showsPrec :: Int -> CursorDirection -> ShowS
$cshowsPrec :: Int -> CursorDirection -> ShowS
Show)
cursorDirectionToSQL :: (IsString sql, IsSQL sql, Monoid sql) => CursorDirection -> sql
cursorDirectionToSQL :: CursorDirection -> sql
cursorDirectionToSQL = \case
CursorDirection
CD_Next -> sql
"NEXT"
CursorDirection
CD_Prior -> sql
"PRIOR"
CursorDirection
CD_First -> sql
"FIRST"
CursorDirection
CD_Last -> sql
"LAST"
CursorDirection
CD_Forward_All -> sql
"FORWARD ALL"
CursorDirection
CD_Backward_All -> sql
"BACKWARD ALL"
CD_Absolute Int
n -> sql
"ABSOLUTE" sql -> sql -> sql
forall m. (IsString m, Monoid m) => m -> m -> m
<+> String -> sql
forall sql. (IsSQL sql, IsString sql) => String -> sql
unsafeSQL (Int -> String
forall a. Show a => a -> String
show Int
n)
CD_Relative Int
n -> sql
"RELATIVE" sql -> sql -> sql
forall m. (IsString m, Monoid m) => m -> m -> m
<+> String -> sql
forall sql. (IsSQL sql, IsString sql) => String -> sql
unsafeSQL (Int -> String
forall a. Show a => a -> String
show Int
n)
CD_Forward Int
n -> sql
"FORWARD" sql -> sql -> sql
forall m. (IsString m, Monoid m) => m -> m -> m
<+> String -> sql
forall sql. (IsSQL sql, IsString sql) => String -> sql
unsafeSQL (Int -> String
forall a. Show a => a -> String
show Int
n)
CD_Backward Int
n -> sql
"BACKWARD" sql -> sql -> sql
forall m. (IsString m, Monoid m) => m -> m -> m
<+> String -> sql
forall sql. (IsSQL sql, IsString sql) => String -> sql
unsafeSQL (Int -> String
forall a. Show a => a -> String
show Int
n)
cursorName :: Cursor sql -> CursorName sql
cursorName :: Cursor sql -> CursorName sql
cursorName (Cursor CursorName sql
name sql
_) = CursorName sql
name
cursorQuery :: Cursor sql -> sql
cursorQuery :: Cursor sql -> sql
cursorQuery (Cursor CursorName sql
_ sql
query) = sql
query
withCursor
:: (IsString sql, IsSQL sql, Monoid sql, MonadDB m, MonadMask m)
=> CursorName sql
-> Scroll
-> Hold
-> sql
-> (Cursor sql -> m r)
-> m r
withCursor :: CursorName sql
-> Scroll -> Hold -> sql -> (Cursor sql -> m r) -> m r
withCursor CursorName sql
name Scroll
scroll Hold
hold sql
sql Cursor sql -> m r
k = m () -> m () -> m r -> m r
forall (m :: * -> *) a c b. MonadMask m => m a -> m c -> m b -> m b
bracket_
(sql -> m ()
forall sql (m :: * -> *). (IsSQL sql, MonadDB m) => sql -> m ()
runQuery_ sql
declareCursor)
(sql -> m ()
forall sql (m :: * -> *). (IsSQL sql, MonadDB m) => sql -> m ()
runQuery_ sql
closeCursor)
(Cursor sql -> m r
k (Cursor sql -> m r) -> Cursor sql -> m r
forall a b. (a -> b) -> a -> b
$ CursorName sql -> sql -> Cursor sql
forall sql. CursorName sql -> sql -> Cursor sql
Cursor CursorName sql
name sql
sql)
where
declareCursor :: sql
declareCursor = [sql] -> sql
forall m. (IsString m, Monoid m) => [m] -> m
smconcat
[ sql
"DECLARE"
, CursorName sql -> sql
forall sql. CursorName sql -> sql
unCursorName CursorName sql
name
, case Scroll
scroll of
Scroll
Scroll -> sql
"SCROLL"
Scroll
NoScroll -> sql
"NO SCROLL"
, sql
"CURSOR"
, case Hold
hold of
Hold
Hold -> sql
"WITH HOLD"
Hold
NoHold -> sql
"WITHOUT HOLD"
, sql
"FOR"
, sql
sql
]
closeCursor :: sql
closeCursor = [sql] -> sql
forall m. (IsString m, Monoid m) => [m] -> m
smconcat
[ sql
"DO $$"
, sql
"BEGIN"
, sql
" EXECUTE 'CLOSE" sql -> sql -> sql
forall m. (IsString m, Monoid m) => m -> m -> m
<+> CursorName sql -> sql
forall sql. CursorName sql -> sql
unCursorName CursorName sql
name sql -> sql -> sql
forall m. (IsString m, Monoid m) => m -> m -> m
<+> sql
"';"
, sql
"EXCEPTION WHEN invalid_cursor_name THEN"
, sql
"END $$"
]
withCursorSQL
:: (MonadDB m, MonadMask m)
=> CursorName SQL
-> Scroll
-> Hold
-> SQL
-> (Cursor SQL -> m r)
-> m r
withCursorSQL :: CursorName SQL
-> Scroll -> Hold -> SQL -> (Cursor SQL -> m r) -> m r
withCursorSQL = CursorName SQL
-> Scroll -> Hold -> SQL -> (Cursor SQL -> m r) -> m r
forall sql (m :: * -> *) r.
(IsString sql, IsSQL sql, Monoid sql, MonadDB m, MonadMask m) =>
CursorName sql
-> Scroll -> Hold -> sql -> (Cursor sql -> m r) -> m r
withCursor
cursorFetch
:: (IsSQL sql, IsString sql, Monoid sql, MonadDB m)
=> Cursor sql
-> CursorDirection
-> m Int
cursorFetch :: Cursor sql -> CursorDirection -> m Int
cursorFetch Cursor sql
cursor CursorDirection
direction = sql -> m Int
forall (m :: * -> *) sql. (MonadDB m, IsSQL sql) => sql -> m Int
runQuery (sql -> m Int) -> sql -> m Int
forall a b. (a -> b) -> a -> b
$ [sql] -> sql
forall m. (IsString m, Monoid m) => [m] -> m
smconcat
[ sql
"FETCH"
, CursorDirection -> sql
forall sql.
(IsString sql, IsSQL sql, Monoid sql) =>
CursorDirection -> sql
cursorDirectionToSQL CursorDirection
direction
, sql
"FROM"
, CursorName sql -> sql
forall sql. CursorName sql -> sql
unCursorName (CursorName sql -> sql) -> CursorName sql -> sql
forall a b. (a -> b) -> a -> b
$ Cursor sql -> CursorName sql
forall sql. Cursor sql -> CursorName sql
cursorName Cursor sql
cursor
]
cursorFetch_ :: (IsSQL sql, IsString sql, Monoid sql, MonadDB m)
=> Cursor sql
-> CursorDirection
-> m ()
cursorFetch_ :: Cursor sql -> CursorDirection -> m ()
cursorFetch_ Cursor sql
cursor = m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Int -> m ())
-> (CursorDirection -> m Int) -> CursorDirection -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cursor sql -> CursorDirection -> m Int
forall sql (m :: * -> *).
(IsSQL sql, IsString sql, Monoid sql, MonadDB m) =>
Cursor sql -> CursorDirection -> m Int
cursorFetch Cursor sql
cursor
cursorMove
:: (IsSQL sql, IsString sql, Monoid sql, MonadDB m)
=> Cursor sql
-> CursorDirection
-> m Int
cursorMove :: Cursor sql -> CursorDirection -> m Int
cursorMove Cursor sql
cursor CursorDirection
direction = sql -> m Int
forall (m :: * -> *) sql. (MonadDB m, IsSQL sql) => sql -> m Int
runQuery (sql -> m Int) -> sql -> m Int
forall a b. (a -> b) -> a -> b
$ [sql] -> sql
forall m. (IsString m, Monoid m) => [m] -> m
smconcat
[ sql
"MOVE"
, CursorDirection -> sql
forall sql.
(IsString sql, IsSQL sql, Monoid sql) =>
CursorDirection -> sql
cursorDirectionToSQL CursorDirection
direction
, sql
"FROM"
, CursorName sql -> sql
forall sql. CursorName sql -> sql
unCursorName (CursorName sql -> sql) -> CursorName sql -> sql
forall a b. (a -> b) -> a -> b
$ Cursor sql -> CursorName sql
forall sql. Cursor sql -> CursorName sql
cursorName Cursor sql
cursor
]
cursorMove_
:: (IsSQL sql, IsString sql, Monoid sql, MonadDB m)
=> Cursor sql
-> CursorDirection
-> m ()
cursorMove_ :: Cursor sql -> CursorDirection -> m ()
cursorMove_ Cursor sql
cursor = m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Int -> m ())
-> (CursorDirection -> m Int) -> CursorDirection -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Cursor sql -> CursorDirection -> m Int
forall sql (m :: * -> *).
(IsSQL sql, IsString sql, Monoid sql, MonadDB m) =>
Cursor sql -> CursorDirection -> m Int
cursorMove Cursor sql
cursor