github.com/geniusesgroup/libgo@v0.0.0-20220713101832-828057a9d3d4/object/service-save-sdk.go (about) 1 /* For license and copyright information please see LEGAL file in repository */ 2 3 package object 4 5 import ( 6 "crypto/sha512" 7 8 etime "../earth-time" 9 "../protocol" 10 "../service" 11 "../srpc" 12 "../syllab" 13 ) 14 15 type saveService struct { 16 service.Service 17 } 18 19 var SaveService = saveService{ 20 Service: service.New("urn:giti:object.protocol:service:save", "", protocol.ServiceStatePreAlpha, 1587282740). 21 SetDetail(protocol.LanguageEnglish, "Save", 22 `Write the object to storage engine. To replace old one you need to delete old`, 23 []string{}). 24 SetAuthorization(protocol.CRUDCreate, protocol.UserTypeApp).Expired(0, ""), 25 } 26 27 func (ser *saveService) DoSRPC(data protocol.Codec) (metadata protocol.ObjectMetadata, err protocol.Error) { 28 var object = make([]byte, MetadataLength, int(MetadataLength)+data.Len()) 29 var objectMetadata = Metadata(object) 30 metadata = objectMetadata 31 objectMetadata.setWriteTime(etime.Now()) 32 objectMetadata.setMediaTypeID(data.MediaType().URN().ID()) 33 objectMetadata.setCompressTypeID(data.CompressType().URN().ID()) 34 objectMetadata.setDataLength(data.Len()) 35 36 object = data.MarshalTo(object[MetadataLength:]) 37 var objectID = sha512.Sum512_256(object[32:]) 38 objectMetadata.setID(objectID) 39 40 var node protocol.ApplicationNode 41 node, err = protocol.App.GetNodeByObjectID(objectID) 42 if err != nil { 43 return 44 } 45 46 var req = SaveRequest{ 47 requestType: RequestTypeBroadcast, 48 object: object, 49 } 50 if node.Status() == protocol.ApplicationStateLocalNode { 51 err = save(req) 52 return 53 } 54 55 _, err = srpc.HandleOutcomeRequest(node.Conn(), ser, &req) 56 return 57 } 58 59 /* 60 Service request and response shape 61 */ 62 63 type saveRequest interface { 64 RequestType() RequestType 65 Object() []byte 66 } 67 68 /* 69 Service Request 70 */ 71 72 // SaveRequest is request structure of Save() 73 type SaveRequest struct { 74 requestType RequestType 75 object []byte 76 } 77 78 // methods to implements saveRequest interface 79 func (req *SaveRequest) RequestType() RequestType { return req.requestType } 80 func (req *SaveRequest) Object() (objectID []byte) { return req.object } 81 func (req *SaveRequest) SetRequestType(rt RequestType) { req.requestType = rt } 82 83 // methods to implements protocol.Syllab interface 84 func (req *SaveRequest) CheckSyllab(payload []byte) (err protocol.Error) { 85 if len(payload) < int(req.LenOfSyllabStack()) { 86 err = syllab.ErrShortArrayDecode 87 } 88 return 89 } 90 func (req *SaveRequest) FromSyllab(payload []byte, stackIndex uint32) { 91 req.requestType = RequestType(syllab.GetUInt8(payload, 0)) 92 req.object = syllab.GetByteArray(payload, 1) 93 } 94 func (req *SaveRequest) ToSyllab(payload []byte, stackIndex, heapIndex uint32) (freeHeapIndex uint32) { 95 syllab.SetUInt8(payload, 4, uint8(req.requestType)) 96 freeHeapIndex = syllab.SetByteArray(payload, req.object, stackIndex, heapIndex) 97 return 98 } 99 func (req *SaveRequest) LenAsSyllab() uint64 { 100 return uint64(req.LenOfSyllabStack() + req.LenOfSyllabHeap()) 101 } 102 func (req *SaveRequest) LenOfSyllabStack() uint32 { return 9 } 103 func (req *SaveRequest) LenOfSyllabHeap() (ln uint32) { return uint32(len(req.object)) } 104 105 type saveRequestSyllab []byte 106 107 // methods to implements saveRequest interface 108 func (req saveRequestSyllab) RequestType() RequestType { return RequestType(syllab.GetUInt8(req, 0)) } 109 func (req saveRequestSyllab) Object() (objectID []byte) { return syllab.GetByteArray(req, 1) } 110 func (req saveRequestSyllab) SetRequestType(rt RequestType) { syllab.SetUInt8(req, 0, uint8(rt)) } 111 112 // methods to implements protocol.Syllab interface 113 func (req saveRequestSyllab) CheckSyllab(payload []byte) (err protocol.Error) { 114 if len(req) < int(req.LenOfSyllabStack()) { 115 err = syllab.ErrShortArrayDecode 116 } 117 return 118 } 119 func (req saveRequestSyllab) FromSyllab(payload []byte, stackIndex uint32) { 120 // err = ErrSourceNotChangeable 121 } 122 func (req saveRequestSyllab) ToSyllab(payload []byte, stackIndex, heapIndex uint32) (freeHeapIndex uint32) { 123 copy(payload[stackIndex:], req) 124 return heapIndex 125 } 126 func (req saveRequestSyllab) LenAsSyllab() uint64 { return 9 } 127 func (req saveRequestSyllab) LenOfSyllabStack() uint32 { return 9 } 128 func (req saveRequestSyllab) LenOfSyllabHeap() (ln uint32) { return uint32(len(req) - 9) }