Cardinal UrmIdbFindIndexedResource (IDBFile file_id, MrmGroup group_filter, MrmType type_filter, URMPointerListPtr index_list) { /* * Local variables */ Cardinal result ; /* function results */ /* * Validate file id, then initiate search with the root node. Return * immediately if there are no indexed resources. */ if ( (result=Idb__FIL_Valid(file_id)) != MrmSUCCESS ) return result ; if ( file_id->num_indexed <= 0 ) return MrmSUCCESS ; return Idb__INX_FindResources (file_id, file_id->index_root, group_filter, type_filter, index_list) ; }
Cardinal Idb__INX_FindResources (IDBFile file_id, IDBRecordNumber recno, MrmGroup group_filter, MrmType type_filter, URMPointerListPtr index_list) { /* * Local variables */ Cardinal result ; /* function results */ IDBRecordBufferPtr bufptr ; /* buffer containing entry */ int entndx ; /* entry loop index */ IDBIndexLeafRecordPtr leafrec ; /* index leaf record */ IDBIndexLeafHdrPtr leafhdr ; /* index leaf header */ IDBIndexNodeRecordPtr noderec ; /* index node record */ IDBIndexNodeHdrPtr nodehdr ; /* index node header */ IDBIndexLeafEntryPtr leaf_ndxvec ; /* index leaf entry vector */ IDBIndexNodeEntryPtr node_ndxvec ; /* index node entry vector */ MrmCount ndxcnt ; /* number of entries in vector */ char *stgbase ; /* base adddress for string offsets */ /* * Read the record in, then bind pointers and process the record. */ result = Idb__BM_GetRecord (file_id, recno, &bufptr) ; if ( result != MrmSUCCESS ) return result ; switch ( _IdbBufferRecordType (bufptr) ) { /* * Simply apply the filter to all entries in the leaf record */ case IDBrtIndexLeaf: leafrec = (IDBIndexLeafRecordPtr) bufptr->IDB_record ; leafhdr = (IDBIndexLeafHdrPtr) &leafrec->leaf_header ; leaf_ndxvec = leafrec->index ; ndxcnt = leafhdr->index_count ; stgbase = (char *) leafrec->index ; for ( entndx=0 ; entndx<ndxcnt ; entndx++ ) { IDBDataHandle entry_data; entry_data.rec_no = leaf_ndxvec[entndx].data.internal_id.rec_no; entry_data.item_offs = leaf_ndxvec[entndx].data.internal_id.item_offs; if ( Idb__DB_MatchFilter(file_id, entry_data, group_filter, type_filter) ) UrmPlistAppendString (index_list, stgbase+leaf_ndxvec[entndx].index_stg) ; Idb__BM_MarkActivity (bufptr) ; } return MrmSUCCESS ; /* * Process the first LT record, then process each index followed by * its GT record. This will produce a correctly ordered list. The * record is read again, and all pointers bound, after each FindResources * call in order to guarantee that buffer turning has not purged the * current record from memory */ case IDBrtIndexNode: noderec = (IDBIndexNodeRecordPtr) bufptr->IDB_record ; nodehdr = (IDBIndexNodeHdrPtr) &noderec->node_header ; node_ndxvec = noderec->index ; ndxcnt = nodehdr->index_count ; stgbase = (char *) noderec->index ; result = Idb__INX_FindResources (file_id, node_ndxvec[0].LT_record, group_filter, type_filter, index_list) ; if ( result != MrmSUCCESS ) return result ; for ( entndx=0 ; entndx<ndxcnt ; entndx++ ) { IDBDataHandle entry_data; entry_data.rec_no = node_ndxvec[entndx].data.internal_id.rec_no; entry_data.item_offs = node_ndxvec[entndx].data.internal_id.item_offs; Idb__BM_GetRecord (file_id, recno, &bufptr) ; noderec = (IDBIndexNodeRecordPtr) bufptr->IDB_record ; nodehdr = (IDBIndexNodeHdrPtr) &noderec->node_header ; node_ndxvec = noderec->index ; stgbase = (char *) noderec->index ; if ( Idb__DB_MatchFilter (file_id, entry_data, group_filter, type_filter) ) UrmPlistAppendString (index_list, stgbase+node_ndxvec[entndx].index_stg) ; result = Idb__INX_FindResources (file_id, node_ndxvec[entndx].GT_record, group_filter, type_filter, index_list) ; if ( result != MrmSUCCESS ) return result ; } return MrmSUCCESS ; default: return Urm__UT_Error ("Idb__INX_FindResources", _MrmMMsg_0010, file_id, NULL, MrmBAD_RECORD) ; } }