project BLF > class Persistence (Progress) > method GetQBuffer


Parameters


icBufferNameinputcharacter
iiQueryIDinputinteger
ohBufferHandleoutputhandle


Internal usage


BLF
method Progress.CheckExistence
method Progress.DBTableExists
method Progress.GetCountOfQueryResult
method Progress.QueryPrepare
method Progress.ReadQueryBackward


program code (program1/progress.p)

do vidx = 1 to 3:

    find tQbuffers where
         tQbuffers.tcTable  = icBufferName and
         tQbuffers.tidx     = vidx         and
         tQbuffers.tlActive = yes          no-error.
    if available tQbuffers
    then do:
        viBufferID = ?.
        viBufferID = tQbuffers.thBuffer:unique-id no-error.
        if viBufferID <> tQbuffers.tiBufferID
        then delete tQbuffers.
    end.
    if available tQbuffers
    then if tQbuffers.tiIsInUseBy = 0
         or iiQueryID = 0
         then do:
             ohBufferHandle = tQbuffers.thBuffer.
             if iiQueryID <> 0
             then assign tQbuffers.tiIsInUseBy = iiQueryID
                         vgQBufferUsage        = vgQBufferUsage + 1
                         tQbuffers.tgUsage     = vgQBufferUsage.
             return.
         end.
         else next.

    create buffer ohBufferHandle
           for table substring(icBufferName,1,length(icBufferName,"CHARACTER":U) - 1,"CHARACTER":U)
           buffer-name icBufferName in widget-pool "persistent" no-error.
    if ohBufferHandle = ? then return.
    
    ohBufferHandle:private-data = "persistent".

    find tQbuffers where
         tQbuffers.tcTable = icBufferName and
         tQbuffers.tidx    = vidx and
         tQbuffers.tlActive = no no-error.
    if not available tQbuffers
    then create tQbuffers.
    assign tQbuffers.tcTable     = icBufferName
           tQbuffers.tidx        = vidx
           tQbuffers.thBuffer    = ohBufferHandle
           tQbuffers.tiBufferID  = ohBufferHandle:unique-id
           tQbuffers.tiIsInUseBy = iiQueryID
           tQbuffers.tlActive    = yes
           vgQBufferUsage        = vgQBufferUsage + 1
           tQbuffers.tgUsage     = vgQBufferUsage.
    release tQbuffers.
    
    viQBufferCount = viQBufferCount + 1.
    leave.
end.

if viQBufferCount > viQBufferLimit
then do:
    vidx = 0.
    for each tQbuffers where
             tQbuffers.tlActive    = yes and
             tQbuffers.tiIsInUseBy = 0
             by tQbuffers.tgUsage on error undo, throw:
        viBufferID = ?.
        viBufferID = tQbuffers.thBuffer:unique-id no-error.
        if viBufferID = tQbuffers.tiBufferID
        then do:
            delete object tQbuffers.thBuffer.
            assign tQbuffers.thBuffer   = ?
                   tQbuffers.tiBufferID = 0
                   tQbuffers.tlActive   = no.
        end.
        else delete tQbuffers.
        viQBufferCount = viQBufferCount - 1.
        vidx = vidx + 1.
        if vidx > 10 then leave.
    end.
end.