コード例 #1
0
ZExport(int) ZSqlLink::getCursor(ZSqlCursor **csr)
{
    ZFUNCTRACE_DEVELOP("ZSqlLink::getCursor(ZSqlCursor **csr)");

    int         ret, prio, curr;
    int         old = -1;
    ZSqlCursor  *c;

    // search for active cursor
    for (curr = 0; curr < iCsrCount; curr++) {
        c = iCsrPool[curr];
        if ( csr == c->iOwner && *csr == c ) {
            ret = c->newParseRequired() || c->iInv;
            goto gotcursor;
        } // if
        if (!c->iPrio) old = curr; // remember least busy cursor
    } // for

    // check if new cursor may be opened
    if (iCsrCount < iMaxCursor) {
        iCsrPool[iCsrCount] = allocCursor();
        curr = iCsrCount;
        iCsrPool[curr]->iPrio = iCsrCount++;
    } else {
        if (old < 0) ZTHROWEXC("Internal error in ZSql.cpp");
        curr = old;
        iCsrPool[curr]->newParseRequired(); // for DB2 cleanup!
    } // if

    // save owner signature and return SqlCursor ptr
    ret = 1;
    c = *csr = iCsrPool[curr];
    c->iOwner = csr;

    gotcursor:
    c->iInv = zFalse;
    // mark this cursor most busy
    if ( c->iPrio < iCsrCount-1) {
        prio = c->iPrio;
        c->iPrio = iCsrCount;
        for (curr = 0; curr < iCsrCount; curr++) {
            c = iCsrPool[curr];
            if (c->iPrio >= prio) c->iPrio--;
        } // for
    } // if
    return ret;
} // getCursor
コード例 #2
0
JBoolean
JMMHashTable::_SetRecordDeleted
(
    JMMRecord*        record,
    const void*       block,
    const JCharacter* file,
    const JUInt32     line,
    const JBoolean    isArray
)
{
    JHashCursor<JMMRecord> allocCursor(itsAllocatedTable, reinterpret_cast<JHashValue>(block) );
    if ( allocCursor.NextHash() )
    {
        JMMRecord thisRecord = allocCursor.GetValue();
        thisRecord.SetDeleteLocation(file, line, isArray);
        itsAllocatedBytes -= thisRecord.GetSize();

        if (!thisRecord.ArrayNew() && isArray)
        {
            NotifyObjectDeletedAsArray(thisRecord);
        }
        else if (thisRecord.ArrayNew() && !isArray)
        {
            NotifyArrayDeletedAsObject(thisRecord);
        }

        allocCursor.Remove();
        if (itsDeletedTable != NULL)
        {
            JHashCursor<JMMRecord> deallocCursor(itsDeletedTable, reinterpret_cast<JHashValue>(block) );
            deallocCursor.ForceNextOpen();
            deallocCursor.Set(reinterpret_cast<JHashValue>(block), thisRecord);
        }
        else
        {
            itsDeletedCount++;
        }

        *record = thisRecord;
        return kJTrue;
    }
    else
    {
        if (itsDeletedTable == NULL)
        {
            NotifyUnallocatedDeletion(file, line, isArray);
        }
        else
        {
            JHashCursor<JMMRecord> deallocCursor(itsDeletedTable, reinterpret_cast<JHashValue>(block) );
            if ( deallocCursor.NextHash() )
            {
                // Seek most recent deallocation at that address
                JMMRecord previousRecord = deallocCursor.GetValue();
                while ( deallocCursor.NextHash() )
                {
                    JMMRecord thisRecord = deallocCursor.GetValue();
                    if ( thisRecord.GetID() > previousRecord.GetID() )
                    {
                        previousRecord = thisRecord;
                    }
                }

                NotifyMultipleDeletion(previousRecord, file, line, isArray);
            }
            else
            {
                NotifyUnallocatedDeletion(file, line, isArray);
            }
        }
        return kJFalse;
    }
}