/*-----------------------------------------------CIRexxApp::addRecordsToIndex-+ | | +----------------------------------------------------------------------------*/ void CIRexxApp::addRecordsToIndex(CArray<ScriptRecord *> & records, CDatabase * db, UInt16 cat, char * dbi) { UInt16 index = 0; UInt32 rowId; MemHandle hMem; Int16 recordPosition = 0; CHash<unsigned int, Int16> recordPositionBySegmentId; ScriptRecord * scriptRecord; if (db == 0) { return; } while ((hMem = db->QueryNextInCategory(index, cat))) { db->GetRecordUniqueID(index, rowId); UInt32 size = MemHandleSize(hMem); const char * pMem = (char *)MemHandleLock(hMem); /* | FORMAT: | %6s #segment.<no>#\ndate() time() <id>\nTitle: <tit>\nCategory: <cat> */ char * scanner; if ( // if it's segmented, combine the segments (scanner = StrStr(pMem, "#segment.")) && (scanner = StrChr(scanner + 1, '#')) ) { char segmentNoAsString[5]; memcpy(segmentNoAsString, scanner - 4, 4); segmentNoAsString[4] = '\0'; int segmentNo = StrAToI(segmentNoAsString); ++scanner; int peditHeaderSize = size - (scanner - pMem); if (peditHeaderSize > ScriptRecord::MAX_PEDITHEADERLEN) { peditHeaderSize = ScriptRecord::MAX_PEDITHEADERLEN; } RexxString header(scanner, peditHeaderSize); RexxString segmentIdAsString; segmentIdAsString.wordAt(header, 3); unsigned int segmentId = hex2uint( (char const *)segmentIdAsString, segmentIdAsString.length() ); int titWordNo = RexxString("Title:").wordpos(header, 1); int catWordNo = RexxString("Category:").wordpos(header, 1); RexxString title; title.subword(header, titWordNo + 1, catWordNo - (titWordNo + 1)); // create the script record Int16 * psegmentedRecordPosition = (Int16 *)recordPositionBySegmentId.Lookup(segmentId); // if this segment has already been encountered, then create a chain of segments if (psegmentedRecordPosition) { ScriptRecord * sr = records[*psegmentedRecordPosition]; sr->m_indexes.Insert(sr->m_indexes.GetCount(), index); sr->m_segments.Insert(sr->m_segments.GetCount(), segmentNo); // otherwise just add it }else { scriptRecord = new ScriptRecord(db, dbi, title, index, segmentNo); recordPositionBySegmentId.SetAt(segmentId, recordPosition); records.Insert(recordPosition++, scriptRecord); } }else { // otherwise just add it unsigned int i; for (i=0; pMem[i] && pMem[i] != linefeedChr && i < ScriptRecord::MAX_TITLELEN; ++i) { ; } char * t = new char[i + 1]; memcpy(t, pMem, i); t[i] = '\0'; RexxString title(t); scriptRecord = new ScriptRecord(db, dbi, title, index); delete [] t; records.Insert(recordPosition++, scriptRecord); } MemHandleUnlock(hMem); ++index; } }