struct metaEntry *getPropNameByName(INDEXDATAHEADER * header, char *word) { int i; for (i = 0; i < header->metaCounter; i++) if (is_meta_property(header->metaEntryArray[i]) && !strcasecmp(header->metaEntryArray[i]->metaName, word)) return header->metaEntryArray[i]->alias ? getPropNameByID( header, header->metaEntryArray[i]->alias ) : header->metaEntryArray[i]; return NULL; }
void sortFileProperties(SWISH * sw, IndexFILE * indexf) { int i; int *out_array = NULL; /* array that gets sorted */ #ifndef USE_BTREE unsigned char *out_buffer = NULL; unsigned char *cur; #endif struct metaEntry *m; int props_sorted = 0; int total_files = indexf->header.totalfiles; FileRec fi; INDEXDATAHEADER *header = &indexf->header; int propIDX; memset( &fi, 0, sizeof( FileRec ) ); #ifdef USE_BTREE DB_InitWriteSortedIndex(sw, indexf->DB ,header->property_count); #else DB_InitWriteSortedIndex(sw, indexf->DB ); #endif /* Any properties to check? */ if ( header->property_count <= 0 ) { DB_EndWriteSortedIndex(sw, indexf->DB); return; } /* Execute for each property */ for (propIDX = 0; propIDX < header->property_count; propIDX++) { /* convert the count to a propID (metaID) */ int metaID = header->propIDX_to_metaID[propIDX]; if ( !(m = getPropNameByID(&indexf->header, metaID ))) progerr("Failed to lookup propIDX %d (metaID %d)", propIDX, metaID ); /* Check if this property must be in a presorted index */ if (!is_presorted_prop(sw, m->metaName)) continue; /* "internal" properties are sorted at runtime */ if (is_meta_internal(m)) continue; if (sw->verbose) { #ifdef DEBUGSORT printf("\n-------------------\nSorting property: %s\n", m->metaName); #else printf("Sorting property: %-40.40s\r", m->metaName); #endif fflush(stdout); } out_array = CreatePropSortArray( indexf, m, &fi, 0 ); #ifdef USE_BTREE DB_WriteSortedIndex(sw, metaID, (unsigned char *)out_array, total_files, indexf->DB); for (i = 0; i < total_files; i++) if ( PropLookup[i].SortProp ) freeProperty( PropLookup[i].SortProp ); #else out_buffer = emalloc( total_files * MAXINTCOMPSIZE ); /* Now compress */ cur = out_buffer; for (i = 0; i < total_files; i++) { cur = compress3( out_array[i], cur ); /* Free the property */ if ( PropLookup[i].SortProp ) freeProperty( PropLookup[i].SortProp ); } DB_WriteSortedIndex(sw, metaID, out_buffer, cur - out_buffer, indexf->DB); efree( out_buffer ); #endif efree( out_array ); props_sorted++; } DB_EndWriteSortedIndex(sw, indexf->DB); if ( props_sorted ) { for (i = 0; i < total_files; i++) if ( PropLookup[i].prop_index ) efree( PropLookup[i].prop_index ); efree( PropLookup ); PropLookup = NULL; } if (sw->verbose) { if ( !props_sorted ) printf("No properties sorted. %-40s\n", " "); else if ( props_sorted == 1 ) printf("One property sorted. %-40s\n", " "); else printf("%d properties sorted. %-40s\n", props_sorted, " "); } }