diff options
author | unknown <serg@serg.mysql.com> | 2001-07-02 21:52:22 +0200 |
---|---|---|
committer | unknown <serg@serg.mysql.com> | 2001-07-02 21:52:22 +0200 |
commit | a1826b55198ebd1ea5a3bafb88a52d1cf0c2f427 (patch) | |
tree | b02cd20fcbc632447cd4b10782204969c9e6af34 /sql/uniques.cc | |
parent | 2d28c646cbd53c1fcdf800dc408580aa5377f3b9 (diff) | |
parent | cdfc04fb0819109ba3f7b78e87191b9b8311b9bf (diff) | |
download | mariadb-git-a1826b55198ebd1ea5a3bafb88a52d1cf0c2f427.tar.gz |
merged
include/my_base.h:
Auto merged
include/myisam.h:
Auto merged
myisam/mi_open.c:
Auto merged
myisam/myisamdef.h:
Auto merged
myisam/myisampack.c:
Auto merged
mysql-test/t/alter_table.test:
Auto merged
mysys/tree.c:
Auto merged
sql/ha_myisam.cc:
Auto merged
sql/item_sum.cc:
Auto merged
sql/mysqld.cc:
Auto merged
sql/sql_table.cc:
Auto merged
Diffstat (limited to 'sql/uniques.cc')
-rw-r--r-- | sql/uniques.cc | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/sql/uniques.cc b/sql/uniques.cc index becb3d8a3a5..5ef7ead276b 100644 --- a/sql/uniques.cc +++ b/sql/uniques.cc @@ -34,14 +34,18 @@ #include "mysql_priv.h" #include "sql_sort.h" -Unique::Unique(qsort_cmp2 comp_func, uint size, ulong max_in_memory_size_arg) + +Unique::Unique(qsort_cmp2 comp_func, void * comp_func_fixed_arg, + uint size, ulong max_in_memory_size_arg) :max_in_memory_size(max_in_memory_size_arg),elements(0) { my_b_clear(&file); - init_tree(&tree, max_in_memory_size / 16, 0, size, comp_func, 0, NULL, NULL); + init_tree(&tree, max_in_memory_size / 16, 0, size, comp_func, 0, NULL, comp_func_fixed_arg); /* If the following fail's the next add will also fail */ init_dynamic_array(&file_ptrs, sizeof(BUFFPEK), 16, 16); max_elements= max_in_memory_size / ALIGN_SIZE(sizeof(TREE_ELEMENT)+size); + open_cached_file(&file, mysql_tmpdir,TEMP_PREFIX, DISK_BUFFER_SIZE, + MYF(MY_WME)); } @@ -69,12 +73,12 @@ bool Unique::flush() } -int unique_write_to_file(gptr key, Unique *unique, element_count count) +int unique_write_to_file(gptr key, element_count count, Unique *unique) { return my_b_write(&unique->file, key, unique->tree.size_of_element) ? 1 : 0; } -int unique_write_to_ptrs(gptr key, Unique *unique, element_count count) +int unique_write_to_ptrs(gptr key, element_count count, Unique *unique) { memcpy(unique->record_pointers, key, unique->tree.size_of_element); unique->record_pointers+=unique->tree.size_of_element; @@ -92,7 +96,7 @@ bool Unique::get(TABLE *table) SORTPARAM sort_param; table->found_records=elements+tree.elements_in_tree; - if (!my_b_inited(&file)) + if (my_b_tell(&file) == 0) { /* Whole tree is in memory; Don't use disk if you don't need to */ if ((record_pointers=table->record_pointers= (byte*) @@ -107,47 +111,47 @@ bool Unique::get(TABLE *table) if (flush()) return 1; - IO_CACHE *outfile=table->io_cache, tempfile; + IO_CACHE *outfile=table->io_cache; BUFFPEK *file_ptr= (BUFFPEK*) file_ptrs.buffer; - uint maxbuffer= file_ptrs.elements; + uint maxbuffer= file_ptrs.elements - 1; uchar *sort_buffer; my_off_t save_pos; bool error=1; - my_b_clear(&tempfile); - /* Open cached file if it isn't open */ - if (! my_b_inited(outfile) && + outfile=table->io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE), + MYF(MY_ZEROFILL)); + + if (!outfile || ! my_b_inited(outfile) && open_cached_file(outfile,mysql_tmpdir,TEMP_PREFIX,READ_RECORD_BUFFER, MYF(MY_WME))) return 1; reinit_io_cache(outfile,WRITE_CACHE,0L,0,0); - - sort_param.keys=elements; + + sort_param.max_rows= elements; sort_param.sort_form=table; sort_param.sort_length=sort_param.ref_length=tree.size_of_element; sort_param.keys= max_in_memory_size / sort_param.sort_length; - if (!(sort_buffer=(uchar*) my_malloc((sort_param.keys+1) * - sort_param.sort_length, - MYF(0)))) + if (!(sort_buffer=(uchar*) my_malloc((sort_param.keys+1) * + sort_param.sort_length, + MYF(0)))) return 1; sort_param.unique_buff= sort_buffer+(sort_param.keys* sort_param.sort_length); /* Merge the buffers to one file, removing duplicates */ - if (merge_many_buff(&sort_param,sort_buffer,file_ptr,&maxbuffer,&tempfile)) + if (merge_many_buff(&sort_param,sort_buffer,file_ptr,&maxbuffer,&file)) goto err; - if (flush_io_cache(&tempfile) || - reinit_io_cache(&tempfile,READ_CACHE,0L,0,0)) + if (flush_io_cache(&file) || + reinit_io_cache(&file,READ_CACHE,0L,0,0)) goto err; - if (merge_buffers(&sort_param, &tempfile, outfile, sort_buffer, file_ptr, + if (merge_buffers(&sort_param, &file, outfile, sort_buffer, file_ptr, file_ptr, file_ptr+maxbuffer,0)) goto err; error=0; err: x_free((gptr) sort_buffer); - close_cached_file(&tempfile); if (flush_io_cache(outfile)) error=1; |