forked from TrueCloudLab/frostfs-node
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
|
package putsvc
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/transformer"
|
||
|
)
|
||
|
|
||
|
var _ transformer.ChunkedObjectWriter = (*inMemoryObjectBuilder)(nil)
|
||
|
|
||
|
type inMemoryObjectBuilder struct {
|
||
|
objectWriter transformer.ObjectWriter
|
||
|
payload *payload
|
||
|
|
||
|
obj *objectSDK.Object
|
||
|
}
|
||
|
|
||
|
func newInMemoryObjectBuilder(objectWriter transformer.ObjectWriter) *inMemoryObjectBuilder {
|
||
|
return &inMemoryObjectBuilder{
|
||
|
objectWriter: objectWriter,
|
||
|
payload: getPayload(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (b *inMemoryObjectBuilder) Close(ctx context.Context) (*transformer.AccessIdentifiers, error) {
|
||
|
defer func() {
|
||
|
putPayload(b.payload)
|
||
|
b.payload = nil
|
||
|
}()
|
||
|
|
||
|
b.obj.SetPayload(b.payload.Data)
|
||
|
|
||
|
if err := b.objectWriter.WriteObject(ctx, b.obj); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
id, _ := b.obj.ID()
|
||
|
return &transformer.AccessIdentifiers{
|
||
|
SelfID: id,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func (b *inMemoryObjectBuilder) Write(_ context.Context, p []byte) (int, error) {
|
||
|
b.payload.Data = append(b.payload.Data, p...)
|
||
|
|
||
|
return len(p), nil
|
||
|
}
|
||
|
|
||
|
func (b *inMemoryObjectBuilder) WriteHeader(_ context.Context, obj *objectSDK.Object) error {
|
||
|
b.obj = obj
|
||
|
|
||
|
return nil
|
||
|
}
|