aboutsummaryrefslogtreecommitdiff
path: root/largeobject.go
diff options
context:
space:
mode:
Diffstat (limited to 'largeobject.go')
-rw-r--r--largeobject.go23
1 files changed, 18 insertions, 5 deletions
diff --git a/largeobject.go b/largeobject.go
index 493671d..4175a70 100644
--- a/largeobject.go
+++ b/largeobject.go
@@ -349,11 +349,7 @@ func (lo *LargeObject) Open(mode LargeObjectOpenMode) (io.WriteCloser, error) {
if mode&OpenAppend == 0 {
if mode&OpenKeepSegments == 0 {
- segmentObjects := make([]*Object, len(lo.segments))
- for idx, segment := range lo.segments {
- segmentObjects[idx] = segment.Object
- }
- _, _, err := lo.Object.c.a.BulkDelete(segmentObjects, nil, nil)
+ _, _, err := lo.Object.c.a.BulkDelete(lo.segmentObjects(), nil, nil)
if err != nil {
return nil, err
}
@@ -371,6 +367,23 @@ func (lo *LargeObject) Segments() ([]SegmentInfo, error) {
return lo.segments, nil
}
+func (lo *LargeObject) segmentObjects() []*Object {
+ seen := make(map[string]bool)
+ result := make([]*Object, 0, len(lo.segments))
+ for _, segment := range lo.segments {
+ if segment.Object == nil { //can happen because of data segments
+ continue
+ }
+ fullName := segment.Object.FullName()
+ if !seen[fullName] {
+ result = append(result, segment.Object)
+ }
+ seen[fullName] = true
+ }
+
+ return result
+}
+
//NextSegmentObject suggests where to upload the next segment.
//
//WARNING: This is a low-level function. Most callers will want to use the