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 }