project BLF > class Persistence (Progress) > method LoadDraftInstance


Parameters


ihClassinputhandle
iiInstanceIdinputinteger
ihInstanceDatainputhandle
icClassNameinputcharacter
oiDraftInstanceIdoutputinteger
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


BLF
method Progress.LoadInstance


program code (program1/progress.p)

TRX: do transaction on error undo, throw:
    
    if ihClass <> ?
    then run GetPublicData in ihClass (input "vlRawTransferSupported", output vcRawTransferSupported, output viFcReturnSuper).

    if not (valid-handle(vhDraftQuery) and
            viDraftUID = vhDraftQuery:unique-id)
    then do:
        create buffer vhDraftBuffer for table "fcDraftInstance":U in widget-pool "persistent".
        create query vhDraftQuery in widget-pool "persistent".
        vhDraftQuery:forward-only = yes.
        vhDraftQuery:set-buffers(vhDraftBuffer).
        vhDraftQuery:private-data = "Persistent".    /* do not ever delete this query */
        viDraftUID = vhDraftQuery:unique-id.
        
        create buffer vhDraftDataBuffer for table "fcDraftInstanceData":U in widget-pool "persistent".
        create query vhDraftDataQuery in widget-pool "persistent".
        vhDraftDataQuery:forward-only = yes.
        vhDraftDataQuery:set-buffers(vhDraftDataBuffer).
        vhDraftDataQuery:private-data = "Persistent".    /* do not ever delete this query */
    end.
    
    vhDraftQuery:query-prepare ("for each fcDraftInstance where fcDraftInstance.DraftInstance_ID = ":U + string(iiInstanceId)).
    vhDraftQuery:query-open().
    vhDraftQuery:get-first(exclusive-lock, no-wait).
    if vhDraftQuery:query-off-end
    or vhDraftBuffer:locked
    then do:
        vhDraftQuery:query-close().
        assign oiReturnStatus = -3
               vcErrorMessage = if vhDraftBuffer:locked
                                then (#T-61'Instance is locked.':255(349881641)T-61# + ' (Draft)')
                                else #T-43'Instance not found.':255(91)T-43# +
                                ' (icClassName= ' + icClassName + ' iiInstanceId= ' + string (iiInstanceId) + ')'.

        <M-7 run ErrorMessage
           (input  vcErrorMessage (icMessage), 
            input  '':U (icArguments), 
            input  '':U (icFieldName), 
            input  '':U (icFieldValue), 
            input  '':U (icRowid), 
            input  ? (ihClass)) in Progress>
        return.
    end.
        
    if  icClassName <> "transaction":U
    and vhDraftBuffer::BusinessClass <> icClassName
    then do:
        assign oiReturnStatus = -3.
        <M-2 run ErrorMessage
           (input  #T-11'Invalid instance number. Found data for business class '$2', but expected business class '$1'.':255(4394)T-11# (icMessage), 
            input  icClassName + chr(2) + vhDraftBuffer::BusinessClass (icArguments), 
            input  '' (icFieldName), 
            input  '' (icFieldValue), 
            input  '' (icRowid), 
            input  ? (ihClass)) in Progress>
        vhDraftBuffer:buffer-release().
        vhDraftQuery:query-close().
        return.
    end.
        
    if vhDraftBuffer::IsInUse = true
    then do:
        assign oiReturnStatus = -3
               vcErrorMessage = #T-37'Instance opened twice.':255(92)T-37# + 
                                ' (icClassName= ' + icClassName + ' iiInstanceId= ' + string (iiInstanceId) + ')'.

        <M-8 run ErrorMessage
           (input  vcErrorMessage (icMessage), 
            input  '' (icArguments), 
            input  '' (icFieldName), 
            input  '' (icFieldValue), 
            input  '' (icRowid), 
            input  ? (ihClass)) in Progress>
        vhDraftBuffer:buffer-release().
        vhDraftQuery:query-close().
        return.
    end.
    
    assign vhDraftBuffer::IsInUse = true.
    vhDraftBuffer:buffer-release().
end.

if vcRawTransferSupported = "false"
then do:
    vhDraftDataQuery:query-prepare ("for each fcDraftInstanceData where fcDraftInstanceData.DraftInstance_ID = ":U + string(iiInstanceId)).
    vhDraftDataQuery:query-open().
    vhDraftDataQuery:get-first(no-lock).
    do while not vhDraftDataQuery:query-off-end:
        vaContext = vhDraftDataBuffer::DraftInstanceData.
        viTotalLength = viTotalLength + length(vaContext,"RAW").
        vhDraftDataQuery:get-next(no-lock).
    end.
    vhDraftDataQuery:query-close().

    set-size(vmContext) = viTotalLength.
    viContextPos = 1.
    vhDraftDataQuery:query-prepare ("for each fcDraftInstanceData where fcDraftInstanceData.DraftInstance_ID = ":U + string(iiInstanceId) + " by fcDraftInstanceData.DraftInstanceSeq").
    vhDraftDataQuery:query-open().
    vhDraftDataQuery:get-first(no-lock).
    do while not vhDraftDataQuery:query-off-end:
        vaContext = vhDraftDataBuffer::DraftInstanceData.
        viRawLength = length(vaContext,"RAW").
        put-bytes (vmcontext,viContextPos) = get-bytes (vaContext,1,viRawLength).
        viContextPos = viContextPos + viRawLength.
        vhDraftDataQuery:get-next(no-lock).
    end.
    
    ihInstanceData:read-xml ("memptr",vmContext,"APPEND","",no).
end.
else do:
    CREATE tRaw. /* Just need one dummy row to store RAW field in by its handle. */
    vhContext = BUFFER tRaw:BUFFER-FIELD("taContext":U):HANDLE.
    
    vhDraftDataQuery:query-prepare ("for each fcDraftInstanceData where fcDraftInstanceData.DraftInstance_ID = ":U + string(iiInstanceId)).
    vhDraftDataQuery:query-open().
    vhDraftDataQuery:get-first(no-lock).
    
    do while not vhDraftDataQuery:query-off-end:
    
        viContextPos = 1.
        vaContext = vhDraftDataBuffer::DraftInstanceData.
        viBuffer = GET-SHORT(vaContext, viContextPos). 
        DO WHILE viBuffer <> 0:
            viBuffer = GET-SHORT(vaContext, viContextPos).
            IF viBuffer <> 0 THEN   /* 0 signals end of data */
            DO:
                IF viBuffer <> viPrevBuffer 
                THEN do:
                    assign vhBuffer = ihInstanceData:GET-BUFFER-HANDLE(viBuffer).
                end.
                viPrevBuffer = viBuffer.
                viContextPos = viContextPos + 2.    /* Move past the table number. */
                viRawLength = GET-LONG(vaContext, viContextPos).
                viContextPos = viContextPos + 4.
                tRaw.taContext = GET-BYTES(vaContext, viContextPos, viRawLength).
                viContextPos = viContextPos + viRawLength.
                vhBuffer:BUFFER-CREATE().
                vhBuffer:RAW-TRANSFER(FALSE, vhContext).
            END.  /* IF iBuffer <> 0 */
        END.      /* WHILE iBuffer <> 0 */
            
        vhDraftDataQuery:get-next(no-lock).
    end.
end.

vhDraftDataQuery:query-close().

oiDraftInstanceId = <M-11 GetNextValue  (input  'InstanceNumber':U (icSequence)) in Progress>.

finally:
    set-size(vmContext) = 0.
    if available tRaw
    then delete tRaw.
end finally.