From f7aed0240511510dfe51083bd7ff12482d8716bc Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 12 Jun 2003 04:29:02 -0700 Subject: Many files: New feature: preload indexes into key cache. mi_preload.c: new file Many files: Added preload statement. sql/ha_myisam.h: Added preload statement. sql/handler.cc: Added preload statement. sql/lex.h: Added preload statement. sql/mysql_priv.h: Added preload statement. sql/sql_lex.h: Added preload statement. sql/sql_base.cc: Added preload statement. sql/sql_table.cc: New feature: preload indexes into key cache. sql/sql_parse.cc: New feature: preload indexes into key cache. sql/mysqld.cc: New feature: preload indexes into key cache. sql/set_var.cc: New feature: preload indexes into key cache. sql/sql_yacc.yy: New feature: preload indexes into key cache. sql/ha_myisam.cc: New feature: preload indexes into key cache. sql/table.h: New feature: preload indexes into key cache. mysys/mf_keycache.c: New feature: preload indexes into key cache. myisam/myisamdef.h: New feature: preload indexes into key cache. myisam/mi_extra.c: New feature: preload indexes into key cache. myisam/Makefile.am: New feature: preload indexes into key cache. include/my_base.h: New feature: preload indexes into key cache. include/my_sys.h: New feature: preload indexes into key cache. include/myisam.h: New feature: preload indexes into key cache. --- myisam/mi_preload.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 myisam/mi_preload.c (limited to 'myisam/mi_preload.c') diff --git a/myisam/mi_preload.c b/myisam/mi_preload.c new file mode 100644 index 00000000000..be45be66ecf --- /dev/null +++ b/myisam/mi_preload.c @@ -0,0 +1,118 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Preload indexes into key cache +*/ + +#include "myisamdef.h" + + +/* + Preload pages of the index file for a table into the key cache + + SYNOPSIS + mi_preload() + info open table + map map of indexes to preload into key cache + ignore_leaves only non-leaves pages are to be preloaded + + RETURN VALUE + 0 if a success. error code - otherwise. + + NOTES. + At present pages for all indexes are preloaded. + In future only pages for indexes specified in the key_map parameter + of the table will be preloaded. +*/ + +int mi_preload(MI_INFO *info, ulonglong key_map, my_bool ignore_leaves) +{ + uint i; + uint length; + uint block_length= 0; + uchar *buff= NULL; + MYISAM_SHARE* share= info->s; + uint keys= share->state.header.keys; + MI_KEYDEF *keyinfo= share->keyinfo; + my_off_t key_file_length= share->state.state.key_file_length; + my_off_t pos= share->base.keystart; + + if (!keys || !key_map || key_file_length == pos) + return 0; + + block_length= keyinfo[0].block_length; + + if (!key_map) + return 0; + + /* Check whether all indexes use the same block size */ + for (i= 1 ; i < keys ; i++) + { + if (keyinfo[i].block_length != block_length) + return (my_errno= HA_ERR_NON_UNIQUE_BLOCK_SIZE); + } + + length= info->preload_buff_size/block_length * block_length; + set_if_bigger(length, block_length); + + if (!(buff= (uchar *) my_malloc(length, MYF(MY_WME)))) + return (my_errno= HA_ERR_OUT_OF_MEM); + + if (flush_key_blocks(share->kfile, FLUSH_RELEASE)) + goto err; + + do + { + /* Read the next block of index file into the preload buffer */ + set_if_smaller(length, key_file_length-pos); + if (my_pread(share->kfile, (byte*) buff, length, pos, MYF(MY_FAE))) + goto err; + + if (ignore_leaves) + { + uchar *end= buff+length; + do + { + if (mi_test_if_nod(buff)) + { + if (key_cache_insert(share->kfile, pos, (byte*) buff, block_length)) + goto err; + } + pos+= block_length; + } + while ((buff+= block_length) != end); + buff= end-length; + } + else + { + if (key_cache_insert(share->kfile, pos, (byte*) buff, length)) + goto err; + pos+= length; + } + + } + while (pos != key_file_length); + + my_free(buff, MYF(0)); + + return 0; + +err: + my_free(buff, MYF(MY_ALLOW_ZERO_PTR)); + return (my_errno= errno); +} + -- cgit v1.2.1