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
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; } }