mongoDB 2.3.0.1 → 2.3.0.2
raw patch · 3 files changed
+27/−8 lines, 3 files
Files
- CHANGELOG.md +5/−0
- Database/MongoDB/GridFS.hs +21/−7
- mongoDB.cabal +1/−1
CHANGELOG.md view
@@ -2,6 +2,11 @@ All notable changes to this project will be documented in this file. This project adheres to [Package Versioning Policy](https://wiki.haskell.org/Package_versioning_policy). +## [2.3.0.2] - 2018-01-28++### Fixed+- Uploading files with GridFS+ ## [2.3.0.1] - 2017-12-28 ### Removed
Database/MongoDB/GridFS.hs view
@@ -3,7 +3,7 @@ -- | MongoDB GridFS implementation {-# LANGUAGE OverloadedStrings, RecordWildCards, NamedFieldPuns, TupleSections, FlexibleContexts, FlexibleInstances, UndecidableInstances, MultiParamTypeClasses, GeneralizedNewtypeDeriving, StandaloneDeriving, TypeSynonymInstances, TypeFamilies, CPP, RankNTypes #-} -module Database.MongoDB.GridFS +module Database.MongoDB.GridFS ( Bucket , files, chunks , File@@ -24,11 +24,11 @@ where import Control.Applicative((<$>))-import Control.Concurrent(forkIO)+ import Control.Monad(when) import Control.Monad.IO.Class import Control.Monad.Trans(MonadTrans, lift)-import Control.Monad.Trans.Resource(MonadResource(..))+ import Data.Conduit import Data.Digest.Pure.MD5 import Data.Int@@ -40,13 +40,17 @@ import qualified Data.Bson as B import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L-import qualified Data.Conduit.Binary as BI-import qualified Data.Conduit.List as CL + defaultChunkSize :: Int64 -- ^ The default chunk size is 256 kB defaultChunkSize = 256 * 1024 +-- magic constant for md5Finalize+md5BlockSizeInBytes :: Int+md5BlockSizeInBytes = 64++ data Bucket = Bucket {files :: Text, chunks :: Text} -- ^ Files are stored in "buckets". You open a bucket with openDefaultBucket or openBucket @@ -125,12 +129,12 @@ , fwAcc :: L.ByteString , fwMd5Context :: MD5Context , fwMd5acc :: L.ByteString- } + } -- Finalize file, calculating md5 digest, saving the last chunk, and creating the file in the bucket finalizeFile :: (Monad m, MonadIO m) => Text -> FileWriter -> Action m File finalizeFile filename (FileWriter chunkSize bucket files_id i size acc md5context md5acc) = do- let md5digest = md5Finalize md5context (L.toStrict md5acc)+ let md5digest = finalizeMD5 md5context (L.toStrict md5acc) when (L.length acc > 0) $ putChunk bucket files_id i acc timestamp <- liftIO $ getCurrentTime let doc = [ "_id" =: files_id@@ -142,6 +146,16 @@ ] insert_ (files bucket) doc return $ File bucket doc++-- finalize the remainder and return the MD5Digest.+finalizeMD5 :: MD5Context -> S.ByteString -> MD5Digest+finalizeMD5 ctx rest =+ md5Finalize ctx2 (S.drop lu rest) -- can only handle max md5BlockSizeInBytes length+ where+ l = S.length rest+ r = l `mod` md5BlockSizeInBytes+ lu = l - r+ ctx2 = md5Update ctx (S.take lu rest) -- Write as many chunks as can be written from the file writer writeChunks :: (Monad m, MonadIO m) => FileWriter -> L.ByteString -> Action m FileWriter
mongoDB.cabal view
@@ -1,5 +1,5 @@ Name: mongoDB-Version: 2.3.0.1+Version: 2.3.0.2 Synopsis: Driver (client) for MongoDB, a free, scalable, fast, document DBMS Description: This package lets you connect to MongoDB servers and