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