static rc_t save_store( struct sorter * sorter ) { rc_t rc = 0; if ( sorter->bytes_in_store > 0 ) { char buffer[ 4096 ]; struct lookup_writer * writer; if ( sorter->params.mem_limit > 0 ) { rc = make_subfilename( &sorter->params, sorter->sub_file_id, buffer, sizeof buffer ); if ( rc == 0 ) sorter->sub_file_id++; } else rc = make_dst_filename( &sorter->params, buffer, sizeof buffer ); if ( rc == 0 ) rc = make_lookup_writer( sorter->params.dir, NULL, &writer, sorter->params.buf_size, "%s", buffer ); if ( rc == 0 ) { rc = KVectorVisitPtr( sorter->store, false, on_store_entry, writer ); release_lookup_writer( writer ); } if ( rc == 0 ) { sorter->bytes_in_store = 0; rc = KVectorRelease( sorter->store ); if ( rc != 0 ) ErrMsg( "KVectorRelease() -> %R", rc ); else { sorter->store = NULL; rc = KVectorMake( &sorter->store ); if ( rc != 0 ) ErrMsg( "KVectorMake() -> %R", rc ); } } } return rc; }
static rc_t make_lookup_writer_obj( struct lookup_writer ** writer, struct index_writer * idx, struct KFile * f ) { rc_t rc = 0; lookup_writer * w = calloc( 1, sizeof * w ); if ( w == NULL ) { rc = RC( rcVDB, rcNoTarg, rcConstructing, rcMemory, rcExhausted ); ErrMsg( "calloc( %d ) -> %R", ( sizeof * w ), rc ); } else { w -> f = f; w -> idx = idx; rc = make_SBuffer( &w -> buf, 4096 ); if ( rc == 0 ) *writer = w; else release_lookup_writer( w ); } return rc; }