| icQueryName | input | character | |
| icPrepare | input | character | For each statement for reading the data, excluding the no-lock option (this is implied automatically), excluding break by (not allowed, only normal by is allowed). |
| icTables | input | character | Comma seperated list of all database tables in the for each statement. |
| olEof | output | logical | yes = no record found no = exactly one record found ? = more than one record found |
| oiReturnStatus | output | integer | Return status of the method. |
assign vgDebugTime = etime
viTables = num-entries(icTables).
/* ================================================================================= */
/* Create a progress dynamic query to read the database */
/* ================================================================================= */
create query vhQuery in widget-pool "non-persistent".
vhQuery:forward-only = yes.
do viFcCount1 = 1 to viTables:
vcBufferName = entry(viFcCount1,icTables).
vhBuffer[viFcCount1] = ?.
if vcBufferName matches "*1"
then do:
<M-8 run GetQBuffer
(input vcBufferName (icBufferName),
input vhQuery:unique-id (iiQueryID),
output vhBuffer[viFcCount1] (ohBufferHandle)) in Progress>
end.
if vhBuffer[viFcCount1] = ?
then do:
/* These buffers will not be cached */
create buffer vhBuffer[viFcCount1]
for table substring(vcBufferName,1,length(vcBufferName,"CHARACTER":U) - 1,"CHARACTER":U)
buffer-name vcBufferName in widget-pool "non-persistent".
vlBufferCreated[viFcCount1] = yes.
end.
vhQuery:add-buffer(vhBuffer[viFcCount1]).
end.
assign vlFcOk = vhQuery:query-prepare (icPrepare) no-error.
if vlFcOk
then assign vlFcOk = vhQuery:query-open() no-error.
if not vlFcOk
then do:
publish "Logging.DatabaseAccess"
("query ":U + icQueryName + chr(10) +
"read ":U + icTables + chr(10) +
icPrepare + chr(10) + "FAILED":U, ?).
<M-10 run ErrorMessage
(input #T-1'Invalid database query ($1).':255(88)T-1# (icMessage),
input icPrepare (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
assign oiReturnStatus = -3.
return.
end.
if vlProgress
then do viFcCount1 = 1 to vhQuery:num-buffers:
assign vcIndexInfo = vcIndexInfo + chr(10) + "Index : ":U
+ vhQuery:index-information(viFcCount1).
end.
assign olEof = vhQuery:get-first (no-lock).
if olEof
then assign olEof = not vhBuffer[1]:available.
else assign olEof = yes.
if olEof = no
then do:
vhQuery:get-next (no-lock).
if vhBuffer[1]:available
then assign olEof = ?.
end.
publish "Logging.DatabaseAccess"
("query ":U + icQueryName + chr(10) +
"read ":U + icTables + chr(10) +
icPrepare + vcIndexInfo + chr(10) +
"found=":U + (if olEof then "none":U else if olEof = no then "one":U else "multiple":U) + chr(10) +
"time(ms)=":U + string(etime - vgDebugTime), ?).
finally:
if vhQuery <> ?
then do:
viFcCount2 = vhQuery:unique-id.
vhQuery:query-close().
delete object vhQuery.
do viFcCount1 = 1 to viTables:
if vlBufferCreated[viFcCount1]
then delete object vhBuffer[viFcCount1].
else do:
<M-95 run ReleaseQBuffer
(input entry(viFcCount1,icTables) (icBufferName),
input viFcCount2 (iiQueryID)) in Progress>
end.
end.
end.
end finally.