Rename types (#12)
* Rename PartInfo -> PartTuple * Rename ListPartInfo -> ObjectPartInfo
This commit is contained in:
parent
abdc9fe320
commit
99d9879cb5
@ -29,7 +29,7 @@ module Network.Minio
|
|||||||
, BucketInfo(..)
|
, BucketInfo(..)
|
||||||
, ObjectInfo(..)
|
, ObjectInfo(..)
|
||||||
, UploadInfo(..)
|
, UploadInfo(..)
|
||||||
, ListPartInfo(..)
|
, ObjectPartInfo(..)
|
||||||
, UploadId
|
, UploadId
|
||||||
, ObjectData(..)
|
, ObjectData(..)
|
||||||
|
|
||||||
|
|||||||
@ -157,30 +157,25 @@ type PartNumber = Int16
|
|||||||
-- | A type alias to represent an upload-id for multipart upload
|
-- | A type alias to represent an upload-id for multipart upload
|
||||||
type UploadId = Text
|
type UploadId = Text
|
||||||
|
|
||||||
-- | A data-type to represent info about a part
|
-- | A type to represent a part-number and etag.
|
||||||
data PartInfo = PartInfo PartNumber ETag
|
type PartTuple = (PartNumber, ETag)
|
||||||
deriving (Show, Eq)
|
|
||||||
|
|
||||||
instance Ord PartInfo where
|
|
||||||
(PartInfo a _) `compare` (PartInfo b _) = a `compare` b
|
|
||||||
|
|
||||||
|
|
||||||
-- | Represents result from a listing of object parts of an ongoing
|
-- | Represents result from a listing of object parts of an ongoing
|
||||||
-- multipart upload.
|
-- multipart upload.
|
||||||
data ListPartsResult = ListPartsResult {
|
data ListPartsResult = ListPartsResult {
|
||||||
lprHasMore :: Bool
|
lprHasMore :: Bool
|
||||||
, lprNextPart :: Maybe Int
|
, lprNextPart :: Maybe Int
|
||||||
, lprParts :: [ListPartInfo]
|
, lprParts :: [ObjectPartInfo]
|
||||||
} deriving (Show, Eq)
|
} deriving (Show, Eq)
|
||||||
|
|
||||||
|
|
||||||
-- | Represents information about an object part in an ongoing
|
-- | Represents information about an object part in an ongoing
|
||||||
-- multipart upload.
|
-- multipart upload.
|
||||||
data ListPartInfo = ListPartInfo {
|
data ObjectPartInfo = ObjectPartInfo {
|
||||||
piNumber :: PartNumber
|
opiNumber :: PartNumber
|
||||||
, piETag :: ETag
|
, opiETag :: ETag
|
||||||
, piSize :: Int64
|
, opiSize :: Int64
|
||||||
, piModTime :: UTCTime
|
, opiModTime :: UTCTime
|
||||||
} deriving (Show, Eq)
|
} deriving (Show, Eq)
|
||||||
|
|
||||||
-- | Represents result from a listing of incomplete uploads to a
|
-- | Represents result from a listing of incomplete uploads to a
|
||||||
|
|||||||
@ -44,10 +44,10 @@ listIncompleteUploads bucket prefix recurse = loop Nothing Nothing
|
|||||||
-- | List object parts of an ongoing multipart upload for given
|
-- | List object parts of an ongoing multipart upload for given
|
||||||
-- bucket, object and uploadId.
|
-- bucket, object and uploadId.
|
||||||
listIncompleteParts :: Bucket -> Object -> UploadId
|
listIncompleteParts :: Bucket -> Object -> UploadId
|
||||||
-> C.Producer Minio ListPartInfo
|
-> C.Producer Minio ObjectPartInfo
|
||||||
listIncompleteParts bucket object uploadId = loop Nothing
|
listIncompleteParts bucket object uploadId = loop Nothing
|
||||||
where
|
where
|
||||||
loop :: Maybe Text -> C.Producer Minio ListPartInfo
|
loop :: Maybe Text -> C.Producer Minio ObjectPartInfo
|
||||||
loop nextPartMarker = do
|
loop nextPartMarker = do
|
||||||
res <- lift $ listIncompleteParts' bucket object uploadId Nothing
|
res <- lift $ listIncompleteParts' bucket object uploadId Nothing
|
||||||
nextPartMarker
|
nextPartMarker
|
||||||
|
|||||||
@ -108,8 +108,8 @@ selectPartSizes size = uncurry (List.zip3 [1..]) $
|
|||||||
|
|
||||||
-- returns partinfo if part is already uploaded.
|
-- returns partinfo if part is already uploaded.
|
||||||
checkUploadNeeded :: Payload -> PartNumber
|
checkUploadNeeded :: Payload -> PartNumber
|
||||||
-> Map.Map PartNumber ListPartInfo
|
-> Map.Map PartNumber ObjectPartInfo
|
||||||
-> Minio (Maybe PartInfo)
|
-> Minio (Maybe PartTuple)
|
||||||
checkUploadNeeded payload n pmap = do
|
checkUploadNeeded payload n pmap = do
|
||||||
(md5hash, pSize) <- case payload of
|
(md5hash, pSize) <- case payload of
|
||||||
PayloadBS bs -> return (hashMD5 bs, fromIntegral $ B.length bs)
|
PayloadBS bs -> return (hashMD5 bs, fromIntegral $ B.length bs)
|
||||||
@ -118,8 +118,8 @@ checkUploadNeeded payload n pmap = do
|
|||||||
(Just $ fromIntegral size)
|
(Just $ fromIntegral size)
|
||||||
case Map.lookup n pmap of
|
case Map.lookup n pmap of
|
||||||
Nothing -> return Nothing
|
Nothing -> return Nothing
|
||||||
Just (ListPartInfo _ etag size _) -> return $
|
Just (ObjectPartInfo _ etag size _) -> return $
|
||||||
bool Nothing (Just (PartInfo n etag)) $
|
bool Nothing (Just (n, etag)) $
|
||||||
md5hash == encodeUtf8 etag && size == pSize
|
md5hash == encodeUtf8 etag && size == pSize
|
||||||
|
|
||||||
parallelMultipartUpload :: Bucket -> Object -> FilePath -> Int64
|
parallelMultipartUpload :: Bucket -> Object -> FilePath -> Int64
|
||||||
@ -187,13 +187,13 @@ sequentialMultipartUpload b o sizeMay src = do
|
|||||||
-- | Looks for incomplete uploads for an object. Returns the first one
|
-- | Looks for incomplete uploads for an object. Returns the first one
|
||||||
-- if there are many.
|
-- if there are many.
|
||||||
getExistingUpload :: Bucket -> Object
|
getExistingUpload :: Bucket -> Object
|
||||||
-> Minio (Maybe UploadId, Map.Map PartNumber ListPartInfo)
|
-> Minio (Maybe UploadId, Map.Map PartNumber ObjectPartInfo)
|
||||||
getExistingUpload b o = do
|
getExistingUpload b o = do
|
||||||
uidMay <- (fmap . fmap) uiUploadId $
|
uidMay <- (fmap . fmap) uiUploadId $
|
||||||
listIncompleteUploads b (Just o) False C.$$ CC.head
|
listIncompleteUploads b (Just o) False C.$$ CC.head
|
||||||
parts <- maybe (return [])
|
parts <- maybe (return [])
|
||||||
(\uid -> listIncompleteParts b o uid C.$$ CC.sinkList) uidMay
|
(\uid -> listIncompleteParts b o uid C.$$ CC.sinkList) uidMay
|
||||||
return (uidMay, Map.fromList $ map (\p -> (piNumber p, p)) parts)
|
return (uidMay, Map.fromList $ map (\p -> (opiNumber p, p)) parts)
|
||||||
|
|
||||||
-- | Copy an object using single or multipart copy strategy.
|
-- | Copy an object using single or multipart copy strategy.
|
||||||
copyObjectInternal :: Bucket -> Object -> CopyPartSource
|
copyObjectInternal :: Bucket -> Object -> CopyPartSource
|
||||||
@ -254,7 +254,7 @@ multiPartCopyObject b o cps srcSize = do
|
|||||||
copiedParts <- limitedMapConcurrently 10
|
copiedParts <- limitedMapConcurrently 10
|
||||||
(\(pn, cps') -> do
|
(\(pn, cps') -> do
|
||||||
(etag, _) <- copyObjectPart b o cps' uid pn []
|
(etag, _) <- copyObjectPart b o cps' uid pn []
|
||||||
return $ PartInfo pn etag
|
return $ (pn, etag)
|
||||||
)
|
)
|
||||||
partSources
|
partSources
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@ module Network.Minio.S3API
|
|||||||
-- * Multipart Upload APIs
|
-- * Multipart Upload APIs
|
||||||
--------------------------
|
--------------------------
|
||||||
, UploadId
|
, UploadId
|
||||||
, PartInfo
|
, PartTuple
|
||||||
, Payload(..)
|
, Payload(..)
|
||||||
, PartNumber
|
, PartNumber
|
||||||
, CopyPartSource(..)
|
, CopyPartSource(..)
|
||||||
@ -171,7 +171,7 @@ newMultipartUpload bucket object headers = do
|
|||||||
|
|
||||||
-- | PUT a part of an object as part of a multipart upload.
|
-- | PUT a part of an object as part of a multipart upload.
|
||||||
putObjectPart :: Bucket -> Object -> UploadId -> PartNumber -> [HT.Header]
|
putObjectPart :: Bucket -> Object -> UploadId -> PartNumber -> [HT.Header]
|
||||||
-> Payload -> Minio PartInfo
|
-> Payload -> Minio PartTuple
|
||||||
putObjectPart bucket object uploadId partNumber headers payload = do
|
putObjectPart bucket object uploadId partNumber headers payload = do
|
||||||
resp <- executeRequest $
|
resp <- executeRequest $
|
||||||
def { riMethod = HT.methodPut
|
def { riMethod = HT.methodPut
|
||||||
@ -185,7 +185,7 @@ putObjectPart bucket object uploadId partNumber headers payload = do
|
|||||||
etag = getETagHeader rheaders
|
etag = getETagHeader rheaders
|
||||||
maybe
|
maybe
|
||||||
(throwM $ ValidationError MErrVETagHeaderNotFound)
|
(throwM $ ValidationError MErrVETagHeaderNotFound)
|
||||||
(return . PartInfo partNumber) etag
|
(return . (partNumber, )) etag
|
||||||
where
|
where
|
||||||
params = [
|
params = [
|
||||||
("uploadId", Just uploadId)
|
("uploadId", Just uploadId)
|
||||||
@ -230,16 +230,16 @@ copyObjectSingle bucket object cps headers = do
|
|||||||
parseCopyObjectResponse $ NC.responseBody resp
|
parseCopyObjectResponse $ NC.responseBody resp
|
||||||
|
|
||||||
-- | Complete a multipart upload.
|
-- | Complete a multipart upload.
|
||||||
completeMultipartUpload :: Bucket -> Object -> UploadId -> [PartInfo]
|
completeMultipartUpload :: Bucket -> Object -> UploadId -> [PartTuple]
|
||||||
-> Minio ETag
|
-> Minio ETag
|
||||||
completeMultipartUpload bucket object uploadId partInfo = do
|
completeMultipartUpload bucket object uploadId partTuple = do
|
||||||
resp <- executeRequest $
|
resp <- executeRequest $
|
||||||
def { riMethod = HT.methodPost
|
def { riMethod = HT.methodPost
|
||||||
, riBucket = Just bucket
|
, riBucket = Just bucket
|
||||||
, riObject = Just object
|
, riObject = Just object
|
||||||
, riQueryParams = mkOptionalParams params
|
, riQueryParams = mkOptionalParams params
|
||||||
, riPayload = PayloadBS $
|
, riPayload = PayloadBS $
|
||||||
mkCompleteMultipartUploadRequest partInfo
|
mkCompleteMultipartUploadRequest partTuple
|
||||||
}
|
}
|
||||||
parseCompleteMultipartUploadResponse $ NC.responseBody resp
|
parseCompleteMultipartUploadResponse $ NC.responseBody resp
|
||||||
where
|
where
|
||||||
|
|||||||
@ -26,13 +26,13 @@ mkCreateBucketConfig location = LBS.toStrict $ renderLBS def bucketConfig
|
|||||||
bucketConfig = Document (Prologue [] Nothing []) root []
|
bucketConfig = Document (Prologue [] Nothing []) root []
|
||||||
|
|
||||||
-- | Create a completeMultipartUpload request body XML
|
-- | Create a completeMultipartUpload request body XML
|
||||||
mkCompleteMultipartUploadRequest :: [PartInfo] -> ByteString
|
mkCompleteMultipartUploadRequest :: [PartTuple] -> ByteString
|
||||||
mkCompleteMultipartUploadRequest partInfo =
|
mkCompleteMultipartUploadRequest partInfo =
|
||||||
LBS.toStrict $ renderLBS def cmur
|
LBS.toStrict $ renderLBS def cmur
|
||||||
where
|
where
|
||||||
root = Element "CompleteMultipartUpload" M.empty $
|
root = Element "CompleteMultipartUpload" M.empty $
|
||||||
map (NodeElement . mkPart) partInfo
|
map (NodeElement . mkPart) partInfo
|
||||||
mkPart (PartInfo n etag) = Element "Part" M.empty
|
mkPart (n, etag) = Element "Part" M.empty
|
||||||
[ NodeElement $ Element "PartNumber" M.empty
|
[ NodeElement $ Element "PartNumber" M.empty
|
||||||
[NodeContent $ T.pack $ show n]
|
[NodeContent $ T.pack $ show n]
|
||||||
, NodeElement $ Element "ETag" M.empty
|
, NodeElement $ Element "ETag" M.empty
|
||||||
|
|||||||
@ -160,7 +160,7 @@ parseListPartsResponse xmldata = do
|
|||||||
nextPartNum <- parseDecimals $ maybeToList nextPartNumStr
|
nextPartNum <- parseDecimals $ maybeToList nextPartNumStr
|
||||||
|
|
||||||
let
|
let
|
||||||
partInfos = map (uncurry4 ListPartInfo) $
|
partInfos = map (uncurry4 ObjectPartInfo) $
|
||||||
zip4 partNumbers partETags partSizes partModTimes
|
zip4 partNumbers partETags partSizes partModTimes
|
||||||
|
|
||||||
return $ ListPartsResult hasMore (listToMaybe nextPartNum) partInfos
|
return $ ListPartsResult hasMore (listToMaybe nextPartNum) partInfos
|
||||||
|
|||||||
@ -336,7 +336,7 @@ liveServerUnitTests = testGroup "Unit tests against a live server"
|
|||||||
(etag, _) <- copyObjectPart bucket copyObj cps{
|
(etag, _) <- copyObjectPart bucket copyObj cps{
|
||||||
cpSourceRange = Just ((p-1)*mb5, (p-1)*mb5 + (mb5 - 1))
|
cpSourceRange = Just ((p-1)*mb5, (p-1)*mb5 + (mb5 - 1))
|
||||||
} uid (fromIntegral p) []
|
} uid (fromIntegral p) []
|
||||||
return $ PartInfo (fromIntegral p) etag
|
return $ (fromIntegral p, etag)
|
||||||
|
|
||||||
step "complete multipart"
|
step "complete multipart"
|
||||||
void $ completeMultipartUpload bucket copyObj uid parts
|
void $ completeMultipartUpload bucket copyObj uid parts
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import Test.Tasty.HUnit
|
|||||||
import Lib.Prelude
|
import Lib.Prelude
|
||||||
|
|
||||||
import Network.Minio.XmlGenerator
|
import Network.Minio.XmlGenerator
|
||||||
import Network.Minio.Data
|
|
||||||
|
|
||||||
xmlGeneratorTests :: TestTree
|
xmlGeneratorTests :: TestTree
|
||||||
xmlGeneratorTests = testGroup "XML Generator Tests"
|
xmlGeneratorTests = testGroup "XML Generator Tests"
|
||||||
@ -29,7 +28,7 @@ testMkCreateBucketConfig = do
|
|||||||
testMkCompleteMultipartUploadRequest :: Assertion
|
testMkCompleteMultipartUploadRequest :: Assertion
|
||||||
testMkCompleteMultipartUploadRequest =
|
testMkCompleteMultipartUploadRequest =
|
||||||
assertEqual "completeMultipartUpload xml should match: " expected $
|
assertEqual "completeMultipartUpload xml should match: " expected $
|
||||||
mkCompleteMultipartUploadRequest [PartInfo 1 "abc"]
|
mkCompleteMultipartUploadRequest [(1, "abc")]
|
||||||
where
|
where
|
||||||
expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
|
expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
|
||||||
\<CompleteMultipartUpload>\
|
\<CompleteMultipartUpload>\
|
||||||
|
|||||||
@ -205,9 +205,9 @@ testParseListPartsResponse = do
|
|||||||
\</ListPartsResult>"
|
\</ListPartsResult>"
|
||||||
|
|
||||||
expectedListResult = ListPartsResult True (Just 3) [part1, part2]
|
expectedListResult = ListPartsResult True (Just 3) [part1, part2]
|
||||||
part1 = ListPartInfo 2 "\"7778aef83f66abc1fa1e8477f296d394\"" 10485760 modifiedTime1
|
part1 = ObjectPartInfo 2 "\"7778aef83f66abc1fa1e8477f296d394\"" 10485760 modifiedTime1
|
||||||
modifiedTime1 = flip UTCTime 74914 $ fromGregorian 2010 11 10
|
modifiedTime1 = flip UTCTime 74914 $ fromGregorian 2010 11 10
|
||||||
part2 = ListPartInfo 3 "\"aaaa18db4cc2f85cedef654fccc4a4x8\"" 10485760 modifiedTime2
|
part2 = ObjectPartInfo 3 "\"aaaa18db4cc2f85cedef654fccc4a4x8\"" 10485760 modifiedTime2
|
||||||
modifiedTime2 = flip UTCTime 74913 $ fromGregorian 2010 11 10
|
modifiedTime2 = flip UTCTime 74913 $ fromGregorian 2010 11 10
|
||||||
|
|
||||||
parsedListPartsResult <- runExceptT $ parseListPartsResponse xmldata
|
parsedListPartsResult <- runExceptT $ parseListPartsResponse xmldata
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user