snaplet-sedna-0.0.1.0: src/Snap/Snaplet/Sedna.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
module Snap.Snaplet.Sedna where
-------------------------------------------------------------------------------
import Control.Monad.IO.Control
import Control.Monad.State
import Database.SednaTypes
import Database.SednaBindings
import Database.Sedna as Sedna
import Snap.Snaplet
import Snap.Snaplet.Sedna.Types
-------------------------------------------------------------------------------
class (MonadControlIO m, ConnSrc s) => HasSedna m s | m -> s where
getConnSrc :: m (s SednaConnection)
-------------------------------------------------------------------------------
data SednaSnaplet s =
ConnSrc s => SednaSnaplet { connSrc :: s SednaConnection }
-------------------------------------------------------------------------------
instance MonadControlIO (Handler b v) where
liftControlIO f = liftIO (f return)
-------------------------------------------------------------------------------
sednaInit :: ConnSrc s => (s SednaConnection) -> SnapletInit b (SednaSnaplet s)
sednaInit src = makeSnaplet "sedna" "Sedna Database Connectivity" Nothing $ do
return $ SednaSnaplet src
-------------------------------------------------------------------------------
withSedna :: (MonadControlIO m, HasSedna m s) => (SednaConnection -> IO a) -> m a
withSedna f = do
src <- getConnSrc
liftIO $ withConn src (liftIO . f)
-------------------------------------------------------------------------------
withSedna' :: HasSedna m s => (SednaConnection -> a) -> m a
withSedna' f = do
src <- getConnSrc
liftIO $ withConn src (return . f)
-------------------------------------------------------------------------------
query :: HasSedna m s => Query -> m QueryResult
query xQuery = do
withSedna $ (\conn -> withTransaction conn (\conn' -> do
sednaExecute conn' xQuery
sednaGetResultString conn'))
-------------------------------------------------------------------------------
disconnect :: HasSedna m s => m ()
disconnect = withSedna sednaCloseConnection
-------------------------------------------------------------------------------
commit :: HasSedna m s => m ()
commit = withSedna sednaCommit
-------------------------------------------------------------------------------
rollback :: HasSedna m s => m ()
rollback = withSedna sednaRollBack
--------------------------------------------------------------------------------
loadXMLFile :: HasSedna m s => FilePath -> Document -> Collection -> m ()
loadXMLFile filepath doc coll = withSedna
(\conn' -> Sedna.loadXMLFile conn'
filepath
doc
coll)