diff options
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/mi_cache.c | 4 | ||||
-rw-r--r-- | myisam/mi_check.c | 146 | ||||
-rw-r--r-- | myisam/myisampack.c | 2 | ||||
-rw-r--r-- | myisam/sort.c | 165 |
4 files changed, 197 insertions, 120 deletions
diff --git a/myisam/mi_cache.c b/myisam/mi_cache.c index bd3c4cd213c..d392a9cc916 100644 --- a/myisam/mi_cache.c +++ b/myisam/mi_cache.c @@ -72,8 +72,8 @@ int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length, in_buff_length=0; if (flag & READING_NEXT || info->share) { - if (pos != - (info->pos_in_file + (uint) (info->read_end - info->request_pos))) + if (pos != (info->pos_in_file + (uint) (info->read_end - + info->request_pos))) { info->pos_in_file=pos; /* Force start here */ info->read_pos=info->read_end=info->request_pos; /* Everything used */ diff --git a/myisam/mi_check.c b/myisam/mi_check.c index f0145aca4fa..9426a55e4d2 100644 --- a/myisam/mi_check.c +++ b/myisam/mi_check.c @@ -1203,10 +1203,11 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info, for (i=0 ; i < share->state.header.max_block_size ; i++) share->state.key_del[i]= HA_OFFSET_ERROR; - /* I think mi_repair and mi_repair_by_sort should do the same - (according, e.g. to ha_myisam::repair), but as mi_repair doesn't - touch key_map it cannot be used to T_CREATE_MISSING_KEYS. - That is what the next line is for... (serg) + /* + I think mi_repair and mi_repair_by_sort should do the same + (according, e.g. to ha_myisam::repair), but as mi_repair doesn't + touch key_map it cannot be used to T_CREATE_MISSING_KEYS. + That is what the next line is for... (serg) */ share->state.key_map= ((((ulonglong) 1L << share->base.keys)-1) & @@ -1737,8 +1738,22 @@ err: type,my_errno); DBUG_RETURN(1); } - /* Fix table or given index using sorting */ - /* saves new table in temp_filename */ + + +/* + Repair table or given index using sorting + + SYNOPSIS + mi_repair_by_sort() + param Repair parameters + info MyISAM handler to repair + name Name of table (for warnings) + rep_quick set to <> 0 if we should not change data file + + RESULT + 0 ok + <>0 Error +*/ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, const char * name, int rep_quick) @@ -1956,8 +1971,8 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, goto err; } } - share->state.state.data_file_length = info->state->data_file_length - = sort_param.filepos; + share->state.state.data_file_length = info->state->data_file_length= + sort_param.filepos; /* Only whole records */ share->state.version=(ulong) time((time_t*) 0); my_close(info->dfile,MYF(0)); @@ -2079,19 +2094,35 @@ err: DBUG_RETURN(got_error); } - /* same as mi_repair_by_sort */ - /* but do it multithreaded */ +/* + Threaded repair of table using sorting + + SYNOPSIS + mi_repair_by_sort_r() + param Repair parameters + info MyISAM handler to repair + name Name of table (for warnings) + rep_quick set to <> 0 if we should not change data file + + DESCRIPTION + Same as mi_repair_by_sort but do it multithreaded + Each key is handled by a separate thread. + + RESULT + 0 ok + <>0 Error +*/ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, - const char * name, int rep_quick) + const char * name, int rep_quick) { int got_error; - uint i,key; - ulong length; + uint i,key, total_key_length; + ulong rec_length; ha_rows start_records; my_off_t new_header_length,del; File new_file; - MI_SORT_PARAM *sort_param=0, *sinfo; + MI_SORT_PARAM *sort_param=0; MYISAM_SHARE *share=info->s; ulong *rec_per_key_part; MI_KEYSEG *keyseg; @@ -2193,14 +2224,14 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, my_seek(param->read_cache.file,0L,MY_SEEK_END,MYF(0)); if (share->data_file_type == DYNAMIC_RECORD) - length=max(share->base.min_pack_length+1,share->base.min_block_length); + rec_length=max(share->base.min_pack_length+1,share->base.min_block_length); else if (share->data_file_type == COMPRESSED_RECORD) - length=share->base.min_block_length; + rec_length=share->base.min_block_length; else - length=share->base.pack_reclength; + rec_length=share->base.pack_reclength; sort_info.max_records= ((param->testflag & T_CREATE_MISSING_KEYS) ? info->state->records : - (ha_rows) (sort_info.filelength/length+1)); + (ha_rows) (sort_info.filelength/rec_length+1)); del=info->state->del; param->glob_crc=0; @@ -2209,13 +2240,13 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, if (!(sort_param=(MI_SORT_PARAM *) my_malloc((uint) share->base.keys * - (sizeof(MI_SORT_PARAM) + share->base.pack_reclength), - MYF(MY_ZEROFILL)))) + (sizeof(MI_SORT_PARAM) + share->base.pack_reclength), + MYF(MY_ZEROFILL)))) { mi_check_print_error(param,"Not enough memory!"); goto err; } - length=0; + total_key_length=0; rec_per_key_part= param->rec_per_key_part; info->state->records=info->state->del=share->state.split=0; info->state->empty=0; @@ -2235,10 +2266,8 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, i--; continue; } - if ((!(param->testflag & T_SILENT))) - printf ("- Fixing index %d\n",key+1); - sort_param[i].key_read=(sort_param[i].keyinfo->flag & HA_FULLTEXT) ? - sort_ft_key_read : sort_key_read; + sort_param[i].key_read= ((sort_param[i].keyinfo->flag & HA_FULLTEXT) ? + sort_ft_key_read : sort_key_read); sort_param[i].key_cmp=sort_key_cmp; sort_param[i].key_write=sort_key_write; sort_param[i].lock_in_memory=lock_memory; @@ -2249,12 +2278,12 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, sort_param[i].filepos=new_header_length; sort_param[i].max_pos=sort_param[i].pos=share->pack.header_length; - sort_param[i].record=((char *)(sort_param+share->base.keys))+ - (share->base.pack_reclength * i); + sort_param[i].record= (((char *)(sort_param+share->base.keys))+ + (share->base.pack_reclength * i)); sort_param[i].key_length=share->rec_reflength; for (keyseg=sort_param[i].keyinfo->seg; keyseg->type != HA_KEYTYPE_END; - keyseg++) + keyseg++) { sort_param[i].key_length+=keyseg->length; if (keyseg->flag & HA_SPACE_PACK) @@ -2264,8 +2293,7 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, if (keyseg->flag & HA_NULL_PART) sort_param[i].key_length++; } - - length+=sort_param[i].key_length; + total_key_length+=sort_param[i].key_length; if (sort_param[i].keyinfo->flag & HA_FULLTEXT) sort_param[i].key_length+=ft_max_word_len_for_sort-ft_max_word_len; @@ -2274,12 +2302,12 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, sort_param[0].fix_datafile= ! rep_quick; sort_info.got_error=0; - pthread_mutex_init(& sort_info.mutex, MY_MUTEX_INIT_FAST); - pthread_cond_init(& sort_info.cond, 0); - pthread_mutex_lock(& sort_info.mutex); + pthread_mutex_init(&sort_info.mutex, MY_MUTEX_INIT_FAST); + pthread_cond_init(&sort_info.cond, 0); + pthread_mutex_lock(&sort_info.mutex); - init_io_cache_share(& param->read_cache, &io_share, i); - for (i=0 ; i<sort_info.total_keys ; i++) + init_io_cache_share(¶m->read_cache, &io_share, i); + for (i=0 ; i < sort_info.total_keys ; i++) { sort_param[i].read_cache=param->read_cache; sort_param[i].sortbuff_size= @@ -2292,13 +2320,13 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, #if 1 param->sort_buffer_length/sort_info.total_keys; #else - param->sort_buffer_length*sort_param[i].key_length/length; + param->sort_buffer_length*sort_param[i].key_length/total_key_length; #endif if (pthread_create(& sort_param[i].thr, 0, - (void *(*)(void*))_thr_find_all_keys, sort_param+i)) + (void *(*)(void*))_thr_find_all_keys, sort_param+i)) { mi_check_print_error(param,"Cannot start a repair thread"); - remove_io_thread(& param->read_cache); + remove_io_thread(¶m->read_cache); sort_info.got_error=1; } else @@ -2307,17 +2335,17 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, /* waiting for all threads to finish */ while (sort_info.threads_running) - pthread_cond_wait(& sort_info.cond, &sort_info.mutex); - pthread_mutex_unlock(& sort_info.mutex); + pthread_cond_wait(&sort_info.cond, &sort_info.mutex); + pthread_mutex_unlock(&sort_info.mutex); - if (got_error=_thr_write_keys(sort_param)) + if ((got_error= _thr_write_keys(sort_param))) { param->retry_repair=1; goto err; } - got_error=1; + got_error=1; /* Assume the following may go wrong */ - if (sort_param[0].fix_datafile) + if (sort_param->fix_datafile) { if (write_data_suffix(&sort_info,1) || end_io_cache(&info->rec_cache)) goto err; @@ -2330,8 +2358,8 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, goto err; } } - share->state.state.data_file_length = info->state->data_file_length - = sort_param->filepos; + share->state.state.data_file_length= info->state->data_file_length= + sort_param->filepos; /* Only whole records */ share->state.version=(ulong) time((time_t*) 0); my_close(info->dfile,MYF(0)); @@ -2372,7 +2400,7 @@ int mi_repair_by_sort_r(MI_CHECK *param, register MI_INFO *info, if (my_chsize(share->kfile,info->state->key_file_length,MYF(0))) mi_check_print_warning(param, - "Can't change size of indexfile, error: %d", my_errno); + "Can't change size of indexfile, error: %d", my_errno); if (!(param->testflag & T_SILENT)) { @@ -2424,8 +2452,8 @@ err: share->state.changed&= ~STATE_NOT_OPTIMIZED_KEYS; share->state.changed|=STATE_NOT_SORTED_PAGES; - pthread_cond_destroy (& sort_info.cond); - pthread_mutex_destroy(& sort_info.mutex); + pthread_cond_destroy (&sort_info.cond); + pthread_mutex_destroy(&sort_info.mutex); my_free((gptr) sort_info.key_block,MYF(MY_ALLOW_ZERO_PTR)); my_free((gptr) sort_param,MYF(MY_ALLOW_ZERO_PTR)); @@ -2457,9 +2485,10 @@ static int sort_key_read(MI_SORT_PARAM *sort_param, void *key) "Found too many records; Can`t continue"); DBUG_RETURN(1); } - sort_param->real_key_length=(info->s->rec_reflength+ - _mi_make_key(info, sort_param->key, (uchar*) key, - sort_param->record, sort_param->filepos)); + sort_param->real_key_length= + (info->s->rec_reflength+ + _mi_make_key(info, sort_param->key, (uchar*) key, + sort_param->record, sort_param->filepos)); DBUG_RETURN(sort_write_record(sort_param)); } /* sort_key_read */ @@ -2981,7 +3010,8 @@ int sort_write_record(MI_SORT_PARAM *sort_param) /* Compare two keys from _create_index_by_sort */ -static int sort_key_cmp(MI_SORT_PARAM *sort_param, const void *a, const void *b) +static int sort_key_cmp(MI_SORT_PARAM *sort_param, const void *a, + const void *b) { uint not_used; return (_mi_key_cmp(sort_param->keyinfo->seg,*((uchar**) a),*((uchar**) b), @@ -2999,8 +3029,9 @@ static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a) if (sort_info->key_block->inited) { - cmp=_mi_key_cmp(sort_param->keyinfo->seg,sort_info->key_block->lastkey, - (uchar*) a, USE_WHOLE_KEY,SEARCH_FIND | SEARCH_UPDATE ,&diff_pos); + cmp=_mi_key_cmp(sort_param->keyinfo->seg, sort_info->key_block->lastkey, + (uchar*) a, USE_WHOLE_KEY, SEARCH_FIND | SEARCH_UPDATE, + &diff_pos); sort_param->unique[diff_pos-1]++; } else @@ -3032,7 +3063,7 @@ static int sort_key_write(MI_SORT_PARAM *sort_param, const void *a) } #endif return (sort_insert_key(sort_param,sort_info->key_block, - (uchar*) a, HA_OFFSET_ERROR)); + (uchar*) a, HA_OFFSET_ERROR)); } /* sort_key_write */ @@ -3448,7 +3479,7 @@ int write_data_suffix(SORT_INFO *sort_info, my_bool fix_datafile) if (my_b_write(&info->rec_cache,buff,sizeof(buff))) { mi_check_print_error(sort_info->param, - "%d when writing to datafile",my_errno); + "%d when writing to datafile",my_errno); return 1; } sort_info->param->read_cache.end_of_file+=sizeof(buff); @@ -3638,8 +3669,7 @@ void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows) */ my_bool mi_test_if_sort_rep(MI_INFO *info, ha_rows rows, - ulonglong key_map, - my_bool force) + ulonglong key_map, my_bool force) { MYISAM_SHARE *share=info->s; MI_KEYDEF *key=share->keyinfo; diff --git a/myisam/myisampack.c b/myisam/myisampack.c index 0064b50348f..b7dd788821a 100644 --- a/myisam/myisampack.c +++ b/myisam/myisampack.c @@ -275,7 +275,7 @@ static void print_version(void) static void usage(void) { print_version(); - puts("Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB"); + puts("Copyright (C) 2002 MySQL AB"); puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,"); puts("and you are welcome to modify and redistribute it under the GPL license\n"); diff --git a/myisam/sort.c b/myisam/sort.c index 75fb8bf7247..65b606f7a68 100644 --- a/myisam/sort.c +++ b/myisam/sort.c @@ -27,7 +27,8 @@ #endif #include <queues.h> - /* static variables */ +/* static variables */ + #undef MIN_SORT_MEMORY #undef MYF_RW #undef DISK_BUFFER_SIZE @@ -48,7 +49,7 @@ typedef struct st_buffpek { extern void print_error _VARARGS((const char *fmt,...)); - /* functions defined in this file */ +/* Functions defined in this file */ static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info,uint keys, uchar **sort_keys, @@ -57,7 +58,8 @@ static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info,uint keys, IO_CACHE *tempfile_for_exceptions); static int NEAR_F write_keys(MI_SORT_PARAM *info,uchar * *sort_keys, uint count, BUFFPEK *buffpek,IO_CACHE *tempfile); -static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, IO_CACHE *tempfile); +static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, + IO_CACHE *tempfile); static int NEAR_F write_index(MI_SORT_PARAM *info,uchar * *sort_keys, uint count); static int NEAR_F merge_many_buff(MI_SORT_PARAM *info,uint keys, @@ -72,8 +74,21 @@ static int NEAR_F merge_buffers(MI_SORT_PARAM *info,uint keys, BUFFPEK *Fb, BUFFPEK *Tb); static int NEAR_F merge_index(MI_SORT_PARAM *,uint,uchar **,BUFFPEK *, int, IO_CACHE *); - /* Creates a index of sorted keys */ - /* Returns 0 if everything went ok */ + + +/* + Creates a index of sorted keys + + SYNOPSIS + _create_index_by_sort() + info Sort parameters + no_messages Set to 1 if no output + sortbuff_size Size if sortbuffer to allocate + + RESULT + 0 ok + <> 0 Error +*/ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, ulong sortbuff_size) @@ -209,7 +224,7 @@ err: } /* _create_index_by_sort */ - /* Search after all keys and place them in a temp. file */ +/* Search after all keys and place them in a temp. file */ static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, uint keys, uchar **sort_keys, DYNAMIC_ARRAY *buffpek, @@ -223,7 +238,7 @@ static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, uint keys, idx=error=0; sort_keys[0]=(uchar*) (sort_keys+keys); - while(!(error=(*info->key_read)(info,sort_keys[idx]))) + while (!(error=(*info->key_read)(info,sort_keys[idx]))) { if (info->real_key_length > info->key_length) { @@ -248,7 +263,8 @@ static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, uint keys, DBUG_RETURN(HA_POS_ERROR); /* Aborted by get_key */ /* purecov: inspected */ if (buffpek->elements) { - if (write_keys(info,sort_keys,idx,(BUFFPEK *)alloc_dynamic(buffpek),tempfile)) + if (write_keys(info,sort_keys,idx,(BUFFPEK *)alloc_dynamic(buffpek), + tempfile)) DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */ *maxbuffer=buffpek->elements-1; } @@ -258,21 +274,22 @@ static ha_rows NEAR_F find_all_keys(MI_SORT_PARAM *info, uint keys, DBUG_RETURN((*maxbuffer)*(keys-1)+idx); } /* find_all_keys */ - /* Search after all keys and place them in a temp. file */ + +/* Search after all keys and place them in a temp. file */ void *_thr_find_all_keys(MI_SORT_PARAM *info) { - int error,skr; + int error; uint memavl,old_memavl,keys,sort_length; uint idx, maxbuffer; uchar **sort_keys; - MI_KEYSEG *keyseg; my_b_clear(&info->tempfile); my_b_clear(&info->tempfile_for_exceptions); bzero((char*) &info->buffpek,sizeof(info->buffpek)); bzero((char*) &info->unique, sizeof(info->unique)); - sort_keys= (uchar **) NULL; error= 1; + sort_keys= (uchar **) NULL; + error= 1; if (info->sort_info->got_error) goto err; @@ -280,12 +297,15 @@ void *_thr_find_all_keys(MI_SORT_PARAM *info) idx= info->sort_info->max_records; sort_length= info->key_length; + maxbuffer=1; while (memavl >= MIN_SORT_MEMORY) { if ((my_off_t) (idx+1)*(sort_length+sizeof(char*)) <= (my_off_t) memavl) keys= idx+1; else + { + uint skr; do { skr=maxbuffer; @@ -299,12 +319,13 @@ void *_thr_find_all_keys(MI_SORT_PARAM *info) } } while ((maxbuffer= (int) (idx/(keys-1)+1)) != skr); - + } if ((sort_keys=(uchar **)my_malloc(keys*(sort_length+sizeof(char*))+ - ((info->keyinfo->flag & HA_FULLTEXT) ? HA_FT_MAXLEN : 0), MYF(0)))) + ((info->keyinfo->flag & HA_FULLTEXT) ? + HA_FT_MAXLEN : 0), MYF(0)))) { if (my_init_dynamic_array(&info->buffpek, sizeof(BUFFPEK), - maxbuffer, maxbuffer/2)) + maxbuffer, maxbuffer/2)) my_free((gptr) sort_keys,MYF(0)); else break; @@ -318,7 +339,6 @@ void *_thr_find_all_keys(MI_SORT_PARAM *info) mi_check_print_error(info->sort_info->param,"Sort buffer to small"); /* purecov: tested */ goto err; /* purecov: tested */ } -// (*info->lock_in_memory)(info->sort_info->param);/* Everything is allocated */ if (info->sort_info->param->testflag & T_VERBOSE) printf("Key %d - Allocating buffer for %d keys\n",info->key+1,keys); @@ -327,12 +347,12 @@ void *_thr_find_all_keys(MI_SORT_PARAM *info) idx=error=0; sort_keys[0]=(uchar*) (sort_keys+keys); - while(!(error=info->sort_info->got_error) || - !(error=(*info->key_read)(info,sort_keys[idx]))) + while (!(error=info->sort_info->got_error) || + !(error=(*info->key_read)(info,sort_keys[idx]))) { if (info->real_key_length > info->key_length) { - if (write_key(info,sort_keys[idx],& info->tempfile_for_exceptions)) + if (write_key(info,sort_keys[idx], &info->tempfile_for_exceptions)) goto err; continue; } @@ -340,7 +360,8 @@ void *_thr_find_all_keys(MI_SORT_PARAM *info) if (++idx == keys) { if (write_keys(info,sort_keys,idx-1, - (BUFFPEK *)alloc_dynamic(&info->buffpek), &info->tempfile)) + (BUFFPEK *)alloc_dynamic(&info->buffpek), + &info->tempfile)) goto err; sort_keys[0]=(uchar*) (sort_keys+keys); @@ -353,8 +374,8 @@ void *_thr_find_all_keys(MI_SORT_PARAM *info) goto err; if (info->buffpek.elements) { - if (write_keys(info,sort_keys,idx,(BUFFPEK *) - alloc_dynamic(&info->buffpek),&info->tempfile)) + if (write_keys(info,sort_keys, idx, + (BUFFPEK *) alloc_dynamic(&info->buffpek), &info->tempfile)) goto err; info->keys=(info->buffpek.elements-1)*(keys-1)+idx; } @@ -370,31 +391,36 @@ err: my_free((gptr) sort_keys,MYF(0)); info->sort_keys=0; delete_dynamic(& info->buffpek); - close_cached_file(& info->tempfile); - close_cached_file(& info->tempfile_for_exceptions); + close_cached_file(&info->tempfile); + close_cached_file(&info->tempfile_for_exceptions); + ok: - remove_io_thread(& info->read_cache); - pthread_mutex_lock(& info->sort_info->mutex); + remove_io_thread(&info->read_cache); + pthread_mutex_lock(&info->sort_info->mutex); info->sort_info->threads_running--; - pthread_cond_signal(& info->sort_info->cond); - pthread_mutex_unlock(& info->sort_info->mutex); + pthread_cond_signal(&info->sort_info->cond); + pthread_mutex_unlock(&info->sort_info->mutex); return NULL; } /* _thr_find_all_keys */ + int _thr_write_keys(MI_SORT_PARAM *sort_param) { SORT_INFO *sort_info=sort_param->sort_info; MI_CHECK *param=sort_info->param; ulong length, keys; ulong *rec_per_key_part=param->rec_per_key_part; - int i, got_error=sort_info->got_error; + int got_error=sort_info->got_error; + uint i; MI_INFO *info=sort_info->info; MYISAM_SHARE *share=info->s; MI_SORT_PARAM *sinfo; byte *mergebuf=0; + LINT_INIT(length); - for (i=0, sinfo=sort_param ; i<sort_info->total_keys ; i++, sinfo++, - rec_per_key_part+=sinfo->keyinfo->keysegs) + for (i=0, sinfo=sort_param ; + i < sort_info->total_keys ; + i++, sinfo++, rec_per_key_part+=sinfo->keyinfo->keysegs) { if (!sinfo->sort_keys) { @@ -404,25 +430,30 @@ int _thr_write_keys(MI_SORT_PARAM *sort_param) share->state.key_map|=(ulonglong) 1 << sinfo->key; if (param->testflag & T_STATISTICS) update_key_parts(sinfo->keyinfo, rec_per_key_part, - sinfo->unique, (ulonglong) info->state->records); + sinfo->unique, (ulonglong) info->state->records); if (!sinfo->buffpek.elements) { if (param->testflag & T_VERBOSE) - printf("Key %d - Dumping %lu keys\n",sinfo->key+1, sinfo->keys); - if (write_index(sinfo,sinfo->sort_keys,(uint) sinfo->keys) || - flush_pending_blocks(sinfo)) + { + printf("Key %d - Dumping %u keys\n",sinfo->key+1, sinfo->keys); + fflush(stdout); + } + if (write_index(sinfo, sinfo->sort_keys, sinfo->keys) || + flush_pending_blocks(sinfo)) got_error=1; } my_free((gptr) sinfo->sort_keys,MYF(0)); sinfo->sort_keys=0; } - for (i=0, sinfo=sort_param ; i<sort_info->total_keys ; i++, sinfo++, - delete_dynamic(& sinfo->buffpek), - close_cached_file(& sinfo->tempfile), - close_cached_file(& sinfo->tempfile_for_exceptions)) + for (i=0, sinfo=sort_param ; + i < sort_info->total_keys ; + i++, sinfo++, delete_dynamic(&sinfo->buffpek), + close_cached_file(&sinfo->tempfile), + close_cached_file(&sinfo->tempfile_for_exceptions)) { - if (got_error) continue; + if (got_error) + continue; if (sinfo->buffpek.elements) { uint maxbuffer=sinfo->buffpek.elements-1; @@ -444,10 +475,10 @@ int _thr_write_keys(MI_SORT_PARAM *sort_param) if (maxbuffer >= MERGEBUFF2) { if (param->testflag & T_VERBOSE) - printf("Key %d - Merging %lu keys\n",sinfo->key+1, sinfo->keys); + printf("Key %d - Merging %u keys\n",sinfo->key+1, sinfo->keys); if (merge_many_buff(sinfo, keys, (uchar **)mergebuf, - dynamic_element(&sinfo->buffpek, 0, BUFFPEK *), - &maxbuffer, &sinfo->tempfile)) + dynamic_element(&sinfo->buffpek, 0, BUFFPEK *), + &maxbuffer, &sinfo->tempfile)) { got_error=1; continue; @@ -463,8 +494,8 @@ int _thr_write_keys(MI_SORT_PARAM *sort_param) printf("Key %d - Last merge and dumping keys", sinfo->key+1); if (merge_index(sinfo, keys, (uchar **)mergebuf, dynamic_element(&sinfo->buffpek,0,BUFFPEK *), - maxbuffer,&sinfo->tempfile) - || flush_pending_blocks(sinfo)) + maxbuffer,&sinfo->tempfile) || + flush_pending_blocks(sinfo)) { got_error=1; continue; @@ -484,15 +515,15 @@ int _thr_write_keys(MI_SORT_PARAM *sort_param) continue; } - while (!got_error - && !my_b_read(&sinfo->tempfile_for_exceptions,(byte*)&key_length, - sizeof(key_length)) - && !my_b_read(&sinfo->tempfile_for_exceptions,(byte*)mergebuf, - (uint) key_length)) + while (!got_error && + !my_b_read(&sinfo->tempfile_for_exceptions,(byte*)&key_length, + sizeof(key_length)) && + !my_b_read(&sinfo->tempfile_for_exceptions,(byte*)mergebuf, + (uint) key_length)) { - if (_mi_ck_write(info,sinfo->key,(uchar*) mergebuf, - key_length - info->s->rec_reflength)) - got_error=1; + if (_mi_ck_write(info,sinfo->key,(uchar*) mergebuf, + key_length - info->s->rec_reflength)) + got_error=1; } } } @@ -526,7 +557,8 @@ static int NEAR_F write_keys(MI_SORT_PARAM *info, register uchar **sort_keys, } /* write_keys */ -static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, IO_CACHE *tempfile) +static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, + IO_CACHE *tempfile) { uint key_length=info->real_key_length; DBUG_ENTER("write_key"); @@ -542,6 +574,7 @@ static int NEAR_F write_key(MI_SORT_PARAM *info, uchar *key, IO_CACHE *tempfile) DBUG_RETURN(0); } /* write_key */ + /* Write index */ static int NEAR_F write_index(MI_SORT_PARAM *info, register uchar **sort_keys, @@ -552,8 +585,10 @@ static int NEAR_F write_index(MI_SORT_PARAM *info, register uchar **sort_keys, qsort2((gptr) sort_keys,(size_t) count,sizeof(byte*), (qsort2_cmp) info->key_cmp,info); while (count--) + { if ((*info->key_write)(info,*sort_keys++)) DBUG_RETURN(-1); /* purecov: inspected */ + } DBUG_RETURN(0); } /* write_index */ @@ -604,8 +639,18 @@ static int NEAR_F merge_many_buff(MI_SORT_PARAM *info, uint keys, } /* merge_many_buff */ - /* Read data to buffer */ - /* This returns (uint) -1 if something goes wrong */ +/* + Read data to buffer + + SYNOPSIS + read_to_buffer() + fromfile File to read from + buffpek Where to read from + sort_length max length to read + RESULT + > 0 Ammount of bytes read + -1 Error +*/ static uint NEAR_F read_to_buffer(IO_CACHE *fromfile, BUFFPEK *buffpek, uint sort_length) @@ -627,8 +672,10 @@ static uint NEAR_F read_to_buffer(IO_CACHE *fromfile, BUFFPEK *buffpek, } /* read_to_buffer */ - /* Merge buffers to one buffer */ - /* If to_file == 0 then use info->key_write */ +/* + Merge buffers to one buffer + If to_file == 0 then use info->key_write +*/ static int NEAR_F merge_buffers(MI_SORT_PARAM *info, uint keys, IO_CACHE *from_file, @@ -654,7 +701,7 @@ merge_buffers(MI_SORT_PARAM *info, uint keys, IO_CACHE *from_file, if (init_queue(&queue,(uint) (Tb-Fb)+1,offsetof(BUFFPEK,key),0, (int (*)(void*, byte *,byte*)) info->key_cmp, - (void*) info->sort_info)) + (void*) info)) DBUG_RETURN(1); /* purecov: inspected */ for (buffpek= Fb ; buffpek <= Tb ; buffpek++) |