project BLF > class Persistence (Progress) > method CheckExistence

Description

Check for existence of data in the database.

PreCondition

This method is used in query existence calls and should not be used anywhere else.


Parameters


icQueryNameinputcharacter
icPrepareinputcharacterFor 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).
icTablesinputcharacterComma seperated list of all database tables in the for each statement.
olEofoutputlogicalyes = no record found
no = exactly one record found
? = more than one record found
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program1/progress.p)

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.