project BLF > class Persistence (other) > method SaveInstance

Description

save instance data to the application database

PreCondition

This method is to be used by instance procedures only.


Parameters


ihClassinputhandle
iiInstanceIDinputintegerinstance ID
ihInstanceDatainputhandledataset with instance data
icClassNameinputcharacterclass name
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program1/other.p)

run SqlSaveInstanceBegin in {&TARGETPROCEDURE}
   (input iiInstanceID,
    input icClassName,
    output vistatus,
    output oiReturnStatus).
if oiReturnStatus < 0
then do:
    <M-1 run SqlErrorMessage (input  ihClass (ihClass), 
                          output viFcReturnSuper (oiReturnStatus)) in other>
    return.
end.

if get-bits(viStatus, 1, 1) <> 0
then do:
    assign oiReturnStatus  = -3
           vcError         = #T-8'Instance is already closed.':255(93)T-8#
           vhPdatabaseInst = ihClass.
    <M-5 run SetMessage (input  vcError (icMessage), 
                     input  '' (icArguments), 
                     input  '' (icFieldName), 
                     input  '' (icFieldValue), 
                     input  'D':U (icType), 
                     input  1 (iiSeverity), 
                     input  '' (icRowid), 
                     input  'BLF-364':U (icFcMsgNumber), 
                     input  '' (icFcExplanation), 
                     input  '' (icFcIdentification), 
                     input  '' (icFcContext), 
                     output viFcReturnSuper (oiReturnStatus)) in database>
    return.
end.

if get-bits(viStatus, 2, 1) <> 0
then do:
    assign oiReturnStatus  = -3
           vcError         = #T-9'Unable to save data for business class $1, cannot overwrite data for business class $2.':255(4393)T-9#
           vhPdatabaseInst = ihClass.
    <M-7 run SetMessage (input  vcError (icMessage), 
                     input  icClassName + chr(2) + '(not available)':U (icArguments), 
                     input  '' (icFieldName), 
                     input  '' (icFieldValue), 
                     input  'D':U (icType), 
                     input  1 (iiSeverity), 
                     input  '' (icRowid), 
                     input  'BLF-365':U (icFcMsgNumber), 
                     input  '' (icFcExplanation), 
                     input  '' (icFcIdentification), 
                     input  '' (icFcContext), 
                     output viFcReturnSuper (oiReturnStatus)) in database>
    return.
end.

CREATE QUERY vhQuery.
vhQuery:private-data = program-name(1). /*debugging*/
CREATE tRaw. /* Just need one dummy row to store RAW field in by its handle. */
vhContext = BUFFER tRaw:BUFFER-FIELD("taContext":U):HANDLE.
SET-SIZE(vmContext) = viMaxLength.

DOBLOCK:
DO viBuffer = 1 TO ihInstanceData:NUM-BUFFERS:

    vhBuffer = ihInstanceData:GET-BUFFER-HANDLE(viBuffer).
    vhQuery:SET-BUFFERS(vhBuffer).
    vhQuery:QUERY-PREPARE("FOR EACH ":U + vhBuffer:NAME).
    vhQuery:QUERY-OPEN().
    vhQuery:GET-FIRST().

    DO WHILE NOT vhQuery:QUERY-OFF-END:

        vhBuffer:RAW-TRANSFER(TRUE, vhContext).
        viRawLength = LENGTH(tRaw.taContext, "RAW":U).
        IF viContextPos + viRawLength + 8 > viMaxLength THEN
        DO:
            /* The data won't fit in a single BLOB, so create another row. */
            PUT-SHORT(vmContext, viContextPos) = 0. /* Signal end of this row. */
            viContextPos = viContextPos + 2.

            run SqlSaveInstanceNext in {&TARGETPROCEDURE}
               (input vmContext,
                input viContextPos,
                output oiReturnStatus).
            if oiReturnStatus < 0
            then do:
                vhQuery:QUERY-CLOSE().
                <M-3 run SqlErrorMessage (input  ihClass (ihClass), 
                                      output viFcReturnSuper (oiReturnStatus)) in other>
                leave DOBLOCK.
            end.


            viContextPos = 1.
        END.
        PUT-SHORT(vmContext, viContextPos) = viBuffer. 
        viContextPos = viContextPos + 2.    /* Move past the table number. */
        PUT-LONG(vmContext, viContextPos) = viRawLength.
        viContextPos = viContextPos + 4.   /* Move past the buffer length. */
        PUT-BYTES(vmContext, viContextPos) = tRaw.taContext.
        viContextPos = viContextPos + viRawLength.
        vhQuery:GET-NEXT().
    END.

    vhQuery:QUERY-CLOSE().

    IF viBuffer = ihInstanceData:NUM-BUFFERS
    THEN DO:
        PUT-SHORT(vmContext, viContextPos) = 0.  /* Mark the end of the data. */
        viContextPos = viContextPos + 2.
    END.
END.

if oiReturnStatus < 0
then run SqlSaveInstanceEnd in {&TARGETPROCEDURE} (input 0, output viFcReturnSuper).
else do:
    /* save last segment */
    run SqlSaveInstanceNext in {&TARGETPROCEDURE}
       (input vmContext,
        input viContextPos,
        output oiReturnStatus).
    if oiReturnStatus < 0
    then run SqlSaveInstanceEnd in {&TARGETPROCEDURE} (input 0, output viFcReturnSuper).
    else run SqlSaveInstanceEnd in {&TARGETPROCEDURE} (input 1, output oiReturnStatus).
    if oiReturnStatus < 0
    then do:
        <M-2 run SqlErrorMessage (input  ihClass (ihClass), 
                          output viFcReturnSuper (oiReturnStatus)) in other>
    end.
end.

delete tRaw.
delete object vhQuery.
SET-SIZE(vmContext) = 0.