module JSDOM.Custom.SQLTransaction (
    module Generated
  , executeSql'
  , executeSql
  , executeSql_
) where

import Data.Maybe (fromJust)

import Control.Monad (void)
import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)
import Control.Monad.IO.Class (MonadIO(..))

import JSDOM.Types
       (withCallback, Callback(..), SQLResultSet(..), SQLError(..), IsObjectArray,
        MonadDOM, ToJSString, SQLStatementCallback(..),
        SQLStatementErrorCallback(..), IsSQLValue)

import JSDOM.Custom.SQLError (throwSQLException)

import JSDOM.Generated.SQLStatementCallback
       (newSQLStatementCallback)
import JSDOM.Generated.SQLStatementErrorCallback
       (newSQLStatementErrorCallback)

import JSDOM.Generated.SQLTransaction as Generated hiding (executeSql)
import qualified
       JSDOM.Generated.SQLTransaction
       as Generated (executeSql)

executeSql' :: (MonadDOM m, ToJSString sqlStatement, IsSQLValue arguments) =>
              SQLTransaction -> sqlStatement -> [arguments] -> m (Either SQLError SQLResultSet)
executeSql' :: SQLTransaction
-> sqlStatement -> [arguments] -> m (Either SQLError SQLResultSet)
executeSql' SQLTransaction
self sqlStatement
sqlStatement [arguments]
arguments = do
    MVar (Either SQLError SQLResultSet)
result <- IO (MVar (Either SQLError SQLResultSet))
-> m (MVar (Either SQLError SQLResultSet))
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO (MVar (Either SQLError SQLResultSet))
forall a. IO (MVar a)
newEmptyMVar
    JSM SQLStatementCallback
-> (SQLStatementCallback -> JSM (Either SQLError SQLResultSet))
-> m (Either SQLError SQLResultSet)
forall (m :: * -> *) c a.
(MonadDOM m, Coercible c Function) =>
JSM c -> (c -> JSM a) -> m a
withCallback ((SQLTransaction -> SQLResultSet -> JSM ())
-> JSM SQLStatementCallback
forall (m :: * -> *).
MonadDOM m =>
(SQLTransaction -> SQLResultSet -> JSM ())
-> m SQLStatementCallback
newSQLStatementCallback (\SQLTransaction
tx SQLResultSet
rs -> IO () -> JSM ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> JSM ())
-> (Either SQLError SQLResultSet -> IO ())
-> Either SQLError SQLResultSet
-> JSM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MVar (Either SQLError SQLResultSet)
-> Either SQLError SQLResultSet -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (Either SQLError SQLResultSet)
result (Either SQLError SQLResultSet -> JSM ())
-> Either SQLError SQLResultSet -> JSM ()
forall a b. (a -> b) -> a -> b
$ SQLResultSet -> Either SQLError SQLResultSet
forall a b. b -> Either a b
Right SQLResultSet
rs)) ((SQLStatementCallback -> JSM (Either SQLError SQLResultSet))
 -> m (Either SQLError SQLResultSet))
-> (SQLStatementCallback -> JSM (Either SQLError SQLResultSet))
-> m (Either SQLError SQLResultSet)
forall a b. (a -> b) -> a -> b
$ \SQLStatementCallback
success ->
        JSM SQLStatementErrorCallback
-> (SQLStatementErrorCallback
    -> JSM (Either SQLError SQLResultSet))
-> JSM (Either SQLError SQLResultSet)
forall (m :: * -> *) c a.
(MonadDOM m, Coercible c Function) =>
JSM c -> (c -> JSM a) -> m a
withCallback ((SQLTransaction -> SQLError -> JSM ())
-> JSM SQLStatementErrorCallback
forall (m :: * -> *).
MonadDOM m =>
(SQLTransaction -> SQLError -> JSM ())
-> m SQLStatementErrorCallback
newSQLStatementErrorCallback (\SQLTransaction
tx SQLError
e -> IO () -> JSM ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> JSM ())
-> (Either SQLError SQLResultSet -> IO ())
-> Either SQLError SQLResultSet
-> JSM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MVar (Either SQLError SQLResultSet)
-> Either SQLError SQLResultSet -> IO ()
forall a. MVar a -> a -> IO ()
putMVar MVar (Either SQLError SQLResultSet)
result (Either SQLError SQLResultSet -> JSM ())
-> Either SQLError SQLResultSet -> JSM ()
forall a b. (a -> b) -> a -> b
$ SQLError -> Either SQLError SQLResultSet
forall a b. a -> Either a b
Left SQLError
e)) ((SQLStatementErrorCallback -> JSM (Either SQLError SQLResultSet))
 -> JSM (Either SQLError SQLResultSet))
-> (SQLStatementErrorCallback
    -> JSM (Either SQLError SQLResultSet))
-> JSM (Either SQLError SQLResultSet)
forall a b. (a -> b) -> a -> b
$ \SQLStatementErrorCallback
error -> do
            SQLTransaction
-> sqlStatement
-> [arguments]
-> Maybe SQLStatementCallback
-> Maybe SQLStatementErrorCallback
-> JSM ()
forall (m :: * -> *) sqlStatement arguments.
(MonadDOM m, ToJSString sqlStatement, IsSQLValue arguments) =>
SQLTransaction
-> sqlStatement
-> [arguments]
-> Maybe SQLStatementCallback
-> Maybe SQLStatementErrorCallback
-> m ()
Generated.executeSql SQLTransaction
self sqlStatement
sqlStatement [arguments]
arguments (SQLStatementCallback -> Maybe SQLStatementCallback
forall a. a -> Maybe a
Just SQLStatementCallback
success) (SQLStatementErrorCallback -> Maybe SQLStatementErrorCallback
forall a. a -> Maybe a
Just SQLStatementErrorCallback
error)
            IO (Either SQLError SQLResultSet)
-> JSM (Either SQLError SQLResultSet)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either SQLError SQLResultSet)
 -> JSM (Either SQLError SQLResultSet))
-> IO (Either SQLError SQLResultSet)
-> JSM (Either SQLError SQLResultSet)
forall a b. (a -> b) -> a -> b
$ MVar (Either SQLError SQLResultSet)
-> IO (Either SQLError SQLResultSet)
forall a. MVar a -> IO a
takeMVar MVar (Either SQLError SQLResultSet)
result

executeSql :: (MonadDOM m, ToJSString sqlStatement, IsSQLValue arguments) =>
              SQLTransaction -> sqlStatement -> [arguments] -> m SQLResultSet
executeSql :: SQLTransaction -> sqlStatement -> [arguments] -> m SQLResultSet
executeSql SQLTransaction
self sqlStatement
sqlStatement [arguments]
arguments = SQLTransaction
-> sqlStatement -> [arguments] -> m (Either SQLError SQLResultSet)
forall (m :: * -> *) sqlStatement arguments.
(MonadDOM m, ToJSString sqlStatement, IsSQLValue arguments) =>
SQLTransaction
-> sqlStatement -> [arguments] -> m (Either SQLError SQLResultSet)
executeSql' SQLTransaction
self sqlStatement
sqlStatement [arguments]
arguments m (Either SQLError SQLResultSet)
-> (Either SQLError SQLResultSet -> m SQLResultSet)
-> m SQLResultSet
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (SQLError -> m SQLResultSet)
-> (SQLResultSet -> m SQLResultSet)
-> Either SQLError SQLResultSet
-> m SQLResultSet
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either SQLError -> m SQLResultSet
forall (m :: * -> *) a. MonadDOM m => SQLError -> m a
throwSQLException SQLResultSet -> m SQLResultSet
forall (m :: * -> *) a. Monad m => a -> m a
return

executeSql_ :: (MonadDOM m, ToJSString sqlStatement, IsSQLValue arguments) =>
              SQLTransaction -> sqlStatement -> [arguments] -> m ()
executeSql_ :: SQLTransaction -> sqlStatement -> [arguments] -> m ()
executeSql_ SQLTransaction
self sqlStatement
sqlStatement [arguments]
arguments = m SQLResultSet -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m SQLResultSet -> m ()) -> m SQLResultSet -> m ()
forall a b. (a -> b) -> a -> b
$ SQLTransaction -> sqlStatement -> [arguments] -> m SQLResultSet
forall (m :: * -> *) sqlStatement arguments.
(MonadDOM m, ToJSString sqlStatement, IsSQLValue arguments) =>
SQLTransaction -> sqlStatement -> [arguments] -> m SQLResultSet
executeSql SQLTransaction
self sqlStatement
sqlStatement [arguments]
arguments