admin
2025-01-22 7e31442f0e9b07764e9c6a9680d3d4aeba5fe1de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Quintiq file version 2.0
#parent: #root
Method ReceiveDataByChunk (NamedValueTree nvt_i, LibDEF_IntegrationEvent event_i)
{
  Description: 'Receive a Data (by chunk) message with the chunked payload of a Set.'
  TextBody:
  [*
    // Jacky CHAN Aug-3-2016 (created)
    dataTransfer := null( LibDEF_DataTransfer );
    event        := event_i;
    
    // check if initialization
    isInit := LibDEF_DataAccessor::GetDataHeaderPropertyAsBoolean( nvt_i, LibDEF_DataAccessor::HEADER_ISINIT() );
    
    if( isInit )
    {
      // extract DataTransfer
      nvBody    := LibDEF_DataAccessor::GetDataBody( nvt_i );
      handleDT  := nvt_i.GetHandle( typeof( LibDEF_DataTransfer ).Name() );
      nodeDT    := nvBody.Child( handleDT );
      dt        := NamedValueTreeIO::ImportObject( nvt_i, nodeDT, typeof( LibDEF_DataTransfer ) ).astype( LibDEF_DataTransfer );
    
      dataTransfer := this.DataBroker().QueueInbox().DataTransfer( relinsert, &dt );
      dataTransfer.ExternalSystem  ( relset, this );
      dataTransfer.IntegrationEvent( relset, event );
    
      // link SetMeta
      setGUID := LibDEF_DataAccessor::GetDataHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_SETGUID() );
      setMeta := select( this, DataBroker.System.SetTypeMeta.SetMeta, sm, sm.GUID() = setGUID );
    
      if( not isnull( setMeta ) )
      {
        dataTransfer.SetMeta( relset, setMeta );
        LibDEF_Util::EventLog( event, "Created data transfer [GUID: " + dataTransfer.GUID() + "]." );
      }
      else
      {
        // log error
        LibDEF_Util::EventLogError( event, "Creating DataTransfer",
                                           "Failed due to SetMeta [GUID: " + setGUID + "] does not exist." );
      }
    }
    else
    {
      // store chunked payload
      transferGUID := LibDEF_DataAccessor::GetDataHeaderPropertyAsString( nvt_i, LibDEF_DataAccessor::HEADER_DATATRANSFERGUID() );
      dataTransfer := select( this, DataTransfer, dt, dt.GUID() = transferGUID );
    
      if( not isnull( dataTransfer ) )
      {
        // delete the newly created event for subsequent messages
        event_i.Delete();
        event := dataTransfer.IntegrationEvent();
      
        sequenceNr := LibDEF_DataAccessor::GetDataHeaderPropertyAsNumber( nvt_i, LibDEF_DataAccessor::HEADER_SEQUENCENR() );
        chunkChecksum := LibDEF_DataAccessor::GetDataHeaderPropertyAsBinaryValue( nvt_i, LibDEF_DataAccessor::HEADER_CHUNK_CHECKSUM() );
        dataPiece  := select( dataTransfer, DataPiece, piece, piece.SequenceNr() = sequenceNr );
        chunkedPayload := LibDEF_DataAccessor::GetDataBodyPropertyAsBinaryValue( nvt_i, LibDEF_DataAccessor::HEADER_CHUNKDATA() );
        
        if( isnull( dataPiece ) )
        {
          dataPiece := LibDEF_DataPiece::Create( dataTransfer, sequenceNr, chunkedPayload, chunkChecksum );
        }
    
        if( not isnull( dataPiece ) )
        {
          if( dataPiece.CheckChecksum() ) // check integrity before marking as completed
          {
            dataPiece.IsCompleted( true );
            LibDEF_Util::EventLog( event, "Buffered data piece sequence-nr #" + [String]sequenceNr + " of data transfer [GUID: " + transferGUID + "]." );
          }
          else
          {
            LibDEF_Util::EventLogError( event, "Buffering DataPiece",
                                        "Failed due to DataPiece of SequenceNr #"
                                        + [String]dataPiece.SequenceNr()
                                        + " of data transfer [GUID: "
                                        + dataPiece.DataTransfer().GUID()
                                        + "] being corrupted (mismatched checksum)." );
          }
        }
        else
        {
          // log error
          LibDEF_Util::EventLogError( event, "Buffering DataPiece",
                                             "Failed due to DataPiece of SequenceNr #" + [String]sequenceNr + " does not exist." );
        }
      }
      else
      {
        // log error
        LibDEF_Util::EventLogError( event, "Processing DataTransfer",
                                           "Failed due to DataTransfer [GUID: " + transferGUID + "] does not exist." );
      }
    
      // check if DataTransfer is completed, then process it normally
      if( dataTransfer.HasCompleted() )
      {
        dsDataset := LibDEF_DataBroker::GetDataset();        
        dsDataset->ProcessCompletedChunkedData( dataTransfer, nvt_i, event );
      }
    }
  *]
}