Description
save instance data to the application database
PreCondition
This method is to be used by instance procedures only.
Parameters
ihClass | input | handle | |
iiInstanceID | input | integer | instance ID |
ihInstanceData | input | handle | dataset with instance data |
icClassName | input | character | class name |
oiReturnStatus | output | integer | Return 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.