{-# LANGUAGE FlexibleContexts #-} module JSDOM.Custom.Database ( module Generated , changeVersion' , changeVersion , transaction' , transaction , readTransaction' , readTransaction ) where import Data.Maybe (fromJust, maybe) import Control.Monad.IO.Class (MonadIO(..)) import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar) import JSDOM.Types (MonadDOM, SQLTransaction, SQLError, DOM, SQLTransactionCallback(..), ToJSString(..), Callback(..), withCallback, SQLTransactionErrorCallback(..), VoidCallback(..)) import JSDOM.Custom.SQLError (throwSQLException) import JSDOM.Generated.SQLTransactionCallback (newSQLTransactionCallbackSync) import JSDOM.Generated.Database as Generated hiding (changeVersion, transaction, readTransaction) import qualified JSDOM.Generated.Database as Generated (changeVersion, transaction, readTransaction) import JSDOM.Generated.SQLTransactionErrorCallback (newSQLTransactionErrorCallback) import JSDOM.Generated.VoidCallback (newVoidCallback) withSQLTransactionCallback :: MonadDOM m => (SQLTransaction -> DOM ()) -> (SQLTransactionCallback -> DOM a) -> m a withSQLTransactionCallback callback = withCallback (newSQLTransactionCallbackSync callback) withSQLErrorCallbacks :: MonadDOM m => (Maybe SQLTransactionErrorCallback -> Maybe VoidCallback -> DOM ()) -> m (Maybe SQLError) withSQLErrorCallbacks f = do result <- liftIO newEmptyMVar withCallback (newSQLTransactionErrorCallback (liftIO . putMVar result . Just)) $ \error -> withCallback (newVoidCallback $ liftIO $ putMVar result Nothing) $ \success -> do f (Just error) (Just success) liftIO $ takeMVar result -- | changeVersion' :: (MonadDOM m, ToJSString oldVersion, ToJSString newVersion) => Database -> oldVersion -> newVersion -> Maybe (SQLTransaction -> DOM ()) -> m (Maybe SQLError) changeVersion' self oldVersion newVersion Nothing = withSQLErrorCallbacks $ Generated.changeVersion self oldVersion newVersion Nothing changeVersion' self oldVersion newVersion (Just callback) = withSQLTransactionCallback callback $ \transaction -> withSQLErrorCallbacks $ \e s -> Generated.changeVersion self oldVersion newVersion (Just transaction) e s changeVersion :: (MonadDOM m, ToJSString oldVersion, ToJSString newVersion) => Database -> oldVersion -> newVersion -> Maybe (SQLTransaction -> DOM ()) -> m () changeVersion self oldVersion newVersion callback = changeVersion' self oldVersion newVersion callback >>= maybe (return ()) throwSQLException -- | transaction' :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError) transaction' self callback = withSQLTransactionCallback callback $ \transaction -> withSQLErrorCallbacks $ \e s -> Generated.transaction self transaction e s transaction :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m () transaction self callback = transaction' self callback >>= maybe (return ()) throwSQLException -- | readTransaction' :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m (Maybe SQLError) readTransaction' self callback = withSQLTransactionCallback callback $ \transaction -> withSQLErrorCallbacks $ \e s -> Generated.readTransaction self transaction e s readTransaction :: (MonadDOM m) => Database -> (SQLTransaction -> DOM ()) -> m () readTransaction self callback = readTransaction' self callback >>= maybe (return ()) throwSQLException