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, " "); } }
void init_property_list(INDEXDATAHEADER *header) { int i; /* only needs to be called one time */ if ( header->property_count ) return; if ( header->propIDX_to_metaID ) progerr("Called init_property_list with non-null header->propIDX_to_metaID"); if ( !header->metaCounter ) { header->property_count = -1; return; } header->propIDX_to_metaID = emalloc( (1 + header->metaCounter) * sizeof( int ) ); header->metaID_to_PropIDX = emalloc( (1 + header->metaCounter) * sizeof( int ) ); for (i = 0; i < header->metaCounter; i++) { if (is_meta_property(header->metaEntryArray[i]) && !header->metaEntryArray[i]->alias && !is_meta_internal(header->metaEntryArray[i]) ) { header->metaID_to_PropIDX[header->metaEntryArray[i]->metaID] = header->property_count; header->propIDX_to_metaID[header->property_count++] = header->metaEntryArray[i]->metaID; } else header->metaID_to_PropIDX[header->metaEntryArray[i]->metaID] = -1; } if ( !header->property_count ) header->property_count = -1; }