215 lines
7.1 KiB
Go
215 lines
7.1 KiB
Go
package object
|
|
|
|
import (
|
|
"github.com/nspcc-dev/neofs-proto/hash"
|
|
"github.com/nspcc-dev/neofs-proto/internal"
|
|
"github.com/nspcc-dev/neofs-proto/refs"
|
|
"github.com/nspcc-dev/neofs-proto/service"
|
|
"github.com/nspcc-dev/neofs-proto/session"
|
|
)
|
|
|
|
type (
|
|
// ID is a type alias of object id.
|
|
ID = refs.ObjectID
|
|
|
|
// CID is a type alias of container id.
|
|
CID = refs.CID
|
|
|
|
// SGID is a type alias of storage group id.
|
|
SGID = refs.SGID
|
|
|
|
// OwnerID is a type alias of owner id.
|
|
OwnerID = refs.OwnerID
|
|
|
|
// Hash is a type alias of Homomorphic hash.
|
|
Hash = hash.Hash
|
|
|
|
// Token is a type alias of session token.
|
|
Token = session.Token
|
|
|
|
// Request defines object rpc requests.
|
|
// All object operations must have TTL, Epoch, Container ID and
|
|
// permission of usage previous network map.
|
|
Request interface {
|
|
service.TTLRequest
|
|
service.EpochRequest
|
|
|
|
CID() CID
|
|
AllowPreviousNetMap() bool
|
|
}
|
|
)
|
|
|
|
const (
|
|
// UnitsB starts enum for amount of bytes.
|
|
UnitsB int64 = 1 << (10 * iota)
|
|
|
|
// UnitsKB defines amount of bytes in one kilobyte.
|
|
UnitsKB
|
|
|
|
// UnitsMB defines amount of bytes in one megabyte.
|
|
UnitsMB
|
|
|
|
// UnitsGB defines amount of bytes in one gigabyte.
|
|
UnitsGB
|
|
|
|
// UnitsTB defines amount of bytes in one terabyte.
|
|
UnitsTB
|
|
)
|
|
|
|
const (
|
|
// ErrNotFound is raised when object is not found in the system.
|
|
ErrNotFound = internal.Error("could not find object")
|
|
|
|
// ErrHeaderExpected is raised when first message in protobuf stream does not contain user header.
|
|
ErrHeaderExpected = internal.Error("expected header as a first message in stream")
|
|
|
|
// KeyStorageGroup is a key for a search object by storage group id.
|
|
KeyStorageGroup = "STORAGE_GROUP"
|
|
|
|
// KeyNoChildren is a key for searching object that have no children links.
|
|
KeyNoChildren = "LEAF"
|
|
|
|
// KeyParent is a key for searching object by id of parent object.
|
|
KeyParent = "PARENT"
|
|
|
|
// KeyHasParent is a key for searching object that have parent link.
|
|
KeyHasParent = "HAS_PAR"
|
|
|
|
// KeyTombstone is a key for searching object that have tombstone header.
|
|
KeyTombstone = "TOMBSTONE"
|
|
|
|
// KeyChild is a key for searching object by id of child link.
|
|
KeyChild = "CHILD"
|
|
|
|
// KeyPrev is a key for searching object by id of previous link.
|
|
KeyPrev = "PREV"
|
|
|
|
// KeyNext is a key for searching object by id of next link.
|
|
KeyNext = "NEXT"
|
|
|
|
// KeyID is a key for searching object by object id.
|
|
KeyID = "ID"
|
|
|
|
// KeyCID is a key for searching object by container id.
|
|
KeyCID = "CID"
|
|
|
|
// KeyOwnerID is a key for searching object by owner id.
|
|
KeyOwnerID = "OWNERID"
|
|
|
|
// KeyRootObject is a key for searching object that are zero-object or do
|
|
// not have any children.
|
|
KeyRootObject = "ROOT_OBJECT"
|
|
)
|
|
|
|
func checkIsNotFull(v interface{}) bool {
|
|
var obj *Object
|
|
|
|
switch t := v.(type) {
|
|
case *GetResponse:
|
|
obj = t.GetObject()
|
|
case *PutRequest:
|
|
if h := t.GetHeader(); h != nil {
|
|
obj = h.Object
|
|
}
|
|
default:
|
|
panic("unknown type")
|
|
}
|
|
|
|
return obj == nil || obj.SystemHeader.PayloadLength != uint64(len(obj.Payload)) && !obj.IsLinking()
|
|
}
|
|
|
|
// NotFull checks if protobuf stream provided whole object for get operation.
|
|
func (m *GetResponse) NotFull() bool { return checkIsNotFull(m) }
|
|
|
|
// NotFull checks if protobuf stream provided whole object for put operation.
|
|
func (m *PutRequest) NotFull() bool { return checkIsNotFull(m) }
|
|
|
|
// GetTTL returns TTL value from object put request.
|
|
func (m *PutRequest) GetTTL() uint32 { return m.GetHeader().TTL }
|
|
|
|
// GetEpoch returns epoch value from object put request.
|
|
func (m *PutRequest) GetEpoch() uint64 { return m.GetHeader().GetEpoch() }
|
|
|
|
// SetTTL sets TTL value into object put request.
|
|
func (m *PutRequest) SetTTL(ttl uint32) { m.GetHeader().TTL = ttl }
|
|
|
|
// SetTTL sets TTL value into object get request.
|
|
func (m *GetRequest) SetTTL(ttl uint32) { m.TTL = ttl }
|
|
|
|
// SetTTL sets TTL value into object head request.
|
|
func (m *HeadRequest) SetTTL(ttl uint32) { m.TTL = ttl }
|
|
|
|
// SetTTL sets TTL value into object search request.
|
|
func (m *SearchRequest) SetTTL(ttl uint32) { m.TTL = ttl }
|
|
|
|
// SetTTL sets TTL value into object delete request.
|
|
func (m *DeleteRequest) SetTTL(ttl uint32) { m.TTL = ttl }
|
|
|
|
// SetTTL sets TTL value into object get range request.
|
|
func (m *GetRangeRequest) SetTTL(ttl uint32) { m.TTL = ttl }
|
|
|
|
// SetTTL sets TTL value into object get range hash request.
|
|
func (m *GetRangeHashRequest) SetTTL(ttl uint32) { m.TTL = ttl }
|
|
|
|
// SetEpoch sets epoch value into object put request.
|
|
func (m *PutRequest) SetEpoch(v uint64) { m.GetHeader().Epoch = v }
|
|
|
|
// SetEpoch sets epoch value into object get request.
|
|
func (m *GetRequest) SetEpoch(v uint64) { m.Epoch = v }
|
|
|
|
// SetEpoch sets epoch value into object head request.
|
|
func (m *HeadRequest) SetEpoch(v uint64) { m.Epoch = v }
|
|
|
|
// SetEpoch sets epoch value into object search request.
|
|
func (m *SearchRequest) SetEpoch(v uint64) { m.Epoch = v }
|
|
|
|
// SetEpoch sets epoch value into object delete request.
|
|
func (m *DeleteRequest) SetEpoch(v uint64) { m.Epoch = v }
|
|
|
|
// SetEpoch sets epoch value into object get range request.
|
|
func (m *GetRangeRequest) SetEpoch(v uint64) { m.Epoch = v }
|
|
|
|
// SetEpoch sets epoch value into object get range hash request.
|
|
func (m *GetRangeHashRequest) SetEpoch(v uint64) { m.Epoch = v }
|
|
|
|
// CID returns container id value from object put request.
|
|
func (m *PutRequest) CID() CID { return m.GetHeader().Object.SystemHeader.CID }
|
|
|
|
// CID returns container id value from object get request.
|
|
func (m *GetRequest) CID() CID { return m.Address.CID }
|
|
|
|
// CID returns container id value from object head request.
|
|
func (m *HeadRequest) CID() CID { return m.Address.CID }
|
|
|
|
// CID returns container id value from object search request.
|
|
func (m *SearchRequest) CID() CID { return m.ContainerID }
|
|
|
|
// CID returns container id value from object delete request.
|
|
func (m *DeleteRequest) CID() CID { return m.Address.CID }
|
|
|
|
// CID returns container id value from object get range request.
|
|
func (m *GetRangeRequest) CID() CID { return m.Address.CID }
|
|
|
|
// CID returns container id value from object get range hash request.
|
|
func (m *GetRangeHashRequest) CID() CID { return m.Address.CID }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object put request.
|
|
func (m *PutRequest) AllowPreviousNetMap() bool { return false }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object get request.
|
|
func (m *GetRequest) AllowPreviousNetMap() bool { return true }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object head request.
|
|
func (m *HeadRequest) AllowPreviousNetMap() bool { return true }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object search request.
|
|
func (m *SearchRequest) AllowPreviousNetMap() bool { return true }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object delete request.
|
|
func (m *DeleteRequest) AllowPreviousNetMap() bool { return false }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object get range request.
|
|
func (m *GetRangeRequest) AllowPreviousNetMap() bool { return false }
|
|
|
|
// AllowPreviousNetMap returns permission to use previous network map in object get range hash request.
|
|
func (m *GetRangeHashRequest) AllowPreviousNetMap() bool { return false }
|