1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16
17 package mongo
18
19 import (
20 "context"
21 "io"
22
23 "perkeep.org/pkg/blob"
24
25 "gopkg.in/mgo.v2"
26 )
27
28 const (
29
30
31 mgoUniqueKeyErr = 11000
32 )
33
34 func (m *mongoStorage) ReceiveBlob(ctx context.Context, ref blob.Ref, source io.Reader) (blob.SizedRef, error) {
35 blobData, err := io.ReadAll(source)
36 if err != nil {
37 return blob.SizedRef{}, err
38 }
39
40 b := blobDoc{Key: ref.String(), Blob: blobData, Size: uint32(len(blobData))}
41
42 if err = m.c.Insert(b); err != nil {
43
44
45 if mongoErr, isMongoErr := err.(*mgo.LastError); isMongoErr && mongoErr.Code == mgoUniqueKeyErr {
46 return blob.SizedRef{Ref: ref, Size: b.Size}, nil
47 }
48 return blob.SizedRef{}, err
49 }
50 return blob.SizedRef{Ref: ref, Size: b.Size}, nil
51 }