mongoDB 0.9.1 → 0.9.2
raw patch · 2 files changed
+29/−9 lines, 2 files
Files
- Database/MongoDB/Query.hs +26/−6
- mongoDB.cabal +3/−3
Database/MongoDB/Query.hs view
@@ -70,11 +70,30 @@ either (return . Left . ConnectionFailure) (runAction act w mos) ePipe -- | A monad with access to a 'Pipe', 'MasterOrSlaveOk', and 'WriteMode', and throws 'Failure' on read, write, or pipe failure-class (Context Pipe m, Context MasterOrSlaveOk m, Context WriteMode m, Throw Failure m, MonadIO' m, MonadMVar m) => Access m-instance (Context Pipe m, Context MasterOrSlaveOk m, Context WriteMode m, Throw Failure m, MonadIO' m, MonadMVar m) => Access m+class (Context Pipe m, Context MasterOrSlaveOk m, Context WriteMode m, Throw Failure m, MonadIO' m) => Access m+instance (Context Pipe m, Context MasterOrSlaveOk m, Context WriteMode m, Throw Failure m, MonadIO' m) => Access m +wrapIO :: (Access m) => (WriteMode -> MasterOrSlaveOk -> Pipe -> IO (Either Failure a)) -> m a+-- ^ Lift IO with Access context and failure into Access monad+wrapIO act = do+ writeMod <- context+ mos <- context+ pipe <- context+ e <- liftIO (act writeMod mos pipe)+ either throw return e++modifyMVar' :: (Access m) => MVar a -> (a -> Action IO (a, b)) -> m b+modifyMVar' var act = wrapIO $ \w m p -> modifyMVar var $ \a -> do+ e <- runAction (act a) w m p+ return $ either ((a,) . Left) (Right <$>) e+ +addMVarFinalizer' :: (Access m) => MVar a -> Action IO () -> m ()+addMVarFinalizer' var act = wrapIO $ \w m p -> do+ addMVarFinalizer var $ runAction act w m p >> return () -- ignore any failure+ return (Right ())+ newtype Action m a = Action (ErrorT Failure (ReaderT WriteMode (ReaderT MasterOrSlaveOk (ReaderT Pipe m))) a)- deriving (Context Pipe, Context MasterOrSlaveOk, Context WriteMode, Throw Failure, MonadIO, MonadMVar, Monad, Applicative, Functor)+ deriving (Context Pipe, Context MasterOrSlaveOk, Context WriteMode, Throw Failure, MonadIO, Monad, Applicative, Functor) -- ^ Monad with access to a 'Pipe', 'MasterOrSlaveOk', and 'WriteMode', and throws a 'Failure' on read, write or pipe failure instance MonadTrans Action where@@ -440,13 +459,14 @@ newCursor (Database db) col batch cs = do var <- newMVar cs let cursor = Cursor (db <.> col) batch var- addMVarFinalizer var (closeCursor cursor)+ addMVarFinalizer' var (closeCursor cursor) return cursor next :: (Access m) => Cursor -> m (Maybe Document) -- ^ Return next document in query result, or Nothing if finished.-next (Cursor fcol batch var) = modifyMVar var nextState where+next (Cursor fcol batch var) = modifyMVar' var nextState where -- Pre-fetch next batch promise from server when last one in current batch is returned.+ nextState:: DelayedCursorState -> Action IO (DelayedCursorState, Maybe Document) nextState dcs = do CS limit cid docs <- mapErrorIO id dcs case docs of@@ -470,7 +490,7 @@ rest c = loop (next c) closeCursor :: (Access m) => Cursor -> m ()-closeCursor (Cursor _ _ var) = modifyMVar var kill' where+closeCursor (Cursor _ _ var) = modifyMVar' var kill' where kill' dcs = first return <$> (kill =<< mapErrorIO id dcs) kill (CS _ cid _) = (CS 0 0 [],) <$> if cid == 0 then return () else send [KillCursors [cid]]
mongoDB.cabal view
@@ -1,5 +1,5 @@ name: mongoDB-version: 0.9.1+version: 0.9.2 build-type: Simple license: OtherLicense license-file: LICENSE@@ -21,8 +21,8 @@ homepage: http://github.com/TonyGen/mongoDB-haskell package-url: bug-reports:-synopsis: A driver for MongoDB-description: This module lets you connect to MongoDB (www.mongodb.org) and do inserts, queries, updates, etc.+synopsis: MongoDB driver+description: This module lets you connect to MongoDB (www.mongodb.org) and do inserts, queries, updates, etc. Please see the example in Database.MongoDB and the tutorial from the homepage. category: Database author: Tony Hannan <tony@10gen.com> & Scott Parish <srp@srparish.net> tested-with: