github.com/GeniusesGroup/libgo@v0.0.0-20220929090155-5ff932cb408e/object/service-get-sdk.go (about)

     1  /* For license and copyright information please see LEGAL file in repository */
     2  
     3  package object
     4  
     5  import (
     6  	"../protocol"
     7  	"../service"
     8  	"../srpc"
     9  	"../syllab"
    10  )
    11  
    12  var GetService = getService{
    13  	Service: service.New("urn:giti:object.protocol:service:get", "", protocol.ServiceStatePreAlpha, 1587282740).
    14  		SetDetail(protocol.LanguageEnglish, "Get",
    15  			`use to get an object by the objectID and structureID! In multi node application, Request must send to proper node otherwise get not found error!`,
    16  			[]string{}).
    17  		SetAuthorization(protocol.CRUDRead, protocol.UserTypeApp).Expired(0, ""),
    18  }
    19  
    20  type getService struct {
    21  	service.Service
    22  }
    23  
    24  func (ser *getService) DoSRPC(req GetRequest) (res protocol.Object, err protocol.Error) {
    25  	var node protocol.ApplicationNode
    26  	node, err = protocol.App.GetNodeByObjectID(req.objectID)
    27  	if err != nil {
    28  		return
    29  	}
    30  
    31  	if node.Status() == protocol.ApplicationStateLocalNode {
    32  		return get(&req)
    33  	}
    34  
    35  	var srpcRes srpc.Response
    36  	srpcRes, err = srpc.HandleOutcomeRequest(node.Conn(), ser, &req)
    37  	if err != nil {
    38  		return
    39  	}
    40  	res = Object(syllab.GetByteArray(srpcRes.Payload(), 0))
    41  	return
    42  }
    43  
    44  /*
    45  	Service request and response shape
    46  */
    47  
    48  type getRequest interface {
    49  	ObjectID() [32]byte
    50  	ObjectStructureID() uint64
    51  }
    52  
    53  /*
    54  	Service Request
    55  */
    56  
    57  // GetRequest is request structure of Get()
    58  type GetRequest struct {
    59  	objectID          [32]byte
    60  	objectStructureID uint64
    61  }
    62  
    63  // methods to implements getRequest interface
    64  func (req *GetRequest) ObjectID() [32]byte               { return req.objectID }
    65  func (req *GetRequest) ObjectStructureID() uint64        { return req.objectStructureID }
    66  func (req *GetRequest) SetObjectID(oID [32]byte)         { req.objectID = oID }
    67  func (req *GetRequest) SetObjectStructureID(osID uint64) { req.objectStructureID = osID }
    68  
    69  // methods to implements protocol.Syllab interface
    70  func (req *GetRequest) CheckSyllab(payload []byte) (err protocol.Error) {
    71  	if len(payload) < int(req.LenOfSyllabStack()) {
    72  		err = syllab.ErrShortArrayDecode
    73  	}
    74  	return
    75  }
    76  func (req *GetRequest) FromSyllab(payload []byte, stackIndex uint32) {
    77  	copy(req.objectID[:], payload[:])
    78  	req.objectStructureID = syllab.GetUInt64(payload, 32)
    79  }
    80  func (req *GetRequest) ToSyllab(payload []byte, stackIndex, heapIndex uint32) (freeHeapIndex uint32) {
    81  	copy(payload[4:], req.objectID[:])
    82  	syllab.SetUInt64(payload, 36, req.objectStructureID)
    83  	return heapIndex
    84  }
    85  func (req *GetRequest) LenAsSyllab() uint64          { return 40 }
    86  func (req *GetRequest) LenOfSyllabStack() uint32     { return 40 }
    87  func (req *GetRequest) LenOfSyllabHeap() (ln uint32) { return }
    88  
    89  type getRequestSyllab []byte
    90  
    91  // methods to implements getRequest interface
    92  func (req getRequestSyllab) ObjectID() (objectID [32]byte)    { copy(objectID[:], req[0:]); return }
    93  func (req getRequestSyllab) ObjectStructureID() (osID uint64) { return syllab.GetUInt64(req, 32) }
    94  
    95  // methods to implements protocol.Syllab interface
    96  func (req getRequestSyllab) CheckSyllab(payload []byte) (err protocol.Error) {
    97  	if len(req) < int(req.LenOfSyllabStack()) {
    98  		err = syllab.ErrShortArrayDecode
    99  	}
   100  	return
   101  }
   102  func (req getRequestSyllab) FromSyllab(payload []byte, stackIndex uint32) {
   103  	// err = ErrSourceNotChangeable
   104  }
   105  func (req getRequestSyllab) ToSyllab(payload []byte, stackIndex, heapIndex uint32) (freeHeapIndex uint32) {
   106  	copy(payload[stackIndex:], req)
   107  	return heapIndex
   108  }
   109  func (req getRequestSyllab) LenAsSyllab() uint64          { return 40 }
   110  func (req getRequestSyllab) LenOfSyllabStack() uint32     { return 40 }
   111  func (req getRequestSyllab) LenOfSyllabHeap() (ln uint32) { return }