summaryrefslogtreecommitdiff
path: root/sql/set_var.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/set_var.cc')
-rw-r--r--sql/set_var.cc156
1 files changed, 107 insertions, 49 deletions
diff --git a/sql/set_var.cc b/sql/set_var.cc
index cb6c875d513..33dcd4b7e29 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -59,6 +59,9 @@
#include "ha_innodb.h"
#endif
+ulong dflt_key_buff_size;
+uint dflt_key_cache_block_size;
+
static HASH system_variable_hash;
const char *bool_type_names[]= { "OFF", "ON", NullS };
TYPELIB bool_typelib=
@@ -88,7 +91,7 @@ static void fix_query_cache_size(THD *thd, enum_var_type type);
static void fix_query_cache_min_res_unit(THD *thd, enum_var_type type);
static void fix_myisam_max_extra_sort_file_size(THD *thd, enum_var_type type);
static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type);
-static KEY_CACHE *create_key_cache(const char *name, uint length);
+static KEY_CACHE_VAR *create_key_cache(const char *name, uint length);
void fix_sql_mode_var(THD *thd, enum_var_type type);
static byte *get_error_count(THD *thd);
static byte *get_warning_count(THD *thd);
@@ -137,6 +140,7 @@ sys_var_thd_ulong sys_interactive_timeout("interactive_timeout",
sys_var_thd_ulong sys_join_buffer_size("join_buffer_size",
&SV::join_buff_size);
sys_var_key_buffer_size sys_key_buffer_size("key_buffer_size");
+sys_var_key_cache_block_size sys_key_cache_block_size("key_cache_block_size");
sys_var_bool_ptr sys_local_infile("local_infile",
&opt_local_infile);
sys_var_thd_bool sys_log_warnings("log_warnings", &SV::log_warnings);
@@ -390,6 +394,7 @@ sys_var *sys_variables[]=
&sys_interactive_timeout,
&sys_join_buffer_size,
&sys_key_buffer_size,
+ &sys_key_cache_block_size,
&sys_last_insert_id,
&sys_local_infile,
&sys_log_binlog,
@@ -547,6 +552,8 @@ struct show_var_st init_vars[]= {
{sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS},
{sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS},
{sys_key_buffer_size.name, (char*) &sys_key_buffer_size, SHOW_SYS},
+ {sys_key_cache_block_size.name, (char*) &sys_key_cache_block_size,
+ SHOW_SYS},
{"language", language, SHOW_CHAR},
{"large_files_support", (char*) &opt_large_files, SHOW_BOOL},
{sys_local_infile.name, (char*) &sys_local_infile, SHOW_SYS},
@@ -1412,70 +1419,93 @@ void sys_var_collation_connection::set_default(THD *thd, enum_var_type type)
}
+static LEX_STRING default_key_cache_base= {(char *) DEFAULT_KEY_CACHE_NAME, 7};
+
+static KEY_CACHE_VAR zero_key_cache= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+static KEY_CACHE_VAR *get_key_cache(LEX_STRING *cache_name)
+{
+ if (!cache_name || !cache_name->str || !cache_name->length ||
+ cache_name->str == default_key_cache_base.str ||
+ (cache_name->length == default_key_cache_base.length &&
+ !memcmp(cache_name->str, default_key_cache_base.str,
+ default_key_cache_base.length)))
+ cache_name= &default_key_cache_base;
+ return ((KEY_CACHE_VAR*) find_named(&key_caches,
+ cache_name->str, cache_name->length));
+}
+
+byte *sys_var_key_cache_param::value_ptr(THD *thd, enum_var_type type,
+ LEX_STRING *base)
+{
+ KEY_CACHE_VAR *key_cache= get_key_cache(base);
+ if (!key_cache)
+ key_cache= &zero_key_cache;
+ return (byte*) key_cache + offset ;
+}
+
bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
{
+ int rc;
ulonglong tmp= var->value->val_int();
+
if (!base_name.length)
- {
- base_name.str= (char*) "default";
- base_name.length= 7;
- }
- KEY_CACHE *key_cache= (KEY_CACHE*) find_named(&key_caches, base_name.str,
- base_name.length);
+ base_name= default_key_cache_base;
+ KEY_CACHE_VAR *key_cache= get_key_cache(&base_name);
+
if (!key_cache)
{
if (!tmp) // Tried to delete cache
return 0; // Ok, nothing to do
+
if (!(key_cache= create_key_cache(base_name.str,
base_name.length)))
return 1;
}
if (!tmp)
{
+ if (!key_cache->cache)
+ return 0;
/* Delete not default key caches */
- if (base_name.length != 7 || memcpy(base_name.str, "default", 7))
+ if (key_cache != &dflt_key_cache_var)
{
/*
- QQ: Here we should move tables using this key cache to default
- key cache
+ Move tables using this key cache to the default key cache
+ and remove this key cache if no tables are assigned to it
*/
- delete key_cache;
- return 0;
+ return (reassign_keycache_tables(thd, key_cache,
+ default_key_cache_base.str, 1));
}
+ return 0;
}
- key_cache->size= (ulonglong) getopt_ull_limit_value(tmp, option_limits);
+ key_cache->buff_size= (ulonglong) getopt_ull_limit_value(tmp, option_limits);
- /* QQ: Needs to be updated when we have multiple key caches */
- keybuff_size= key_cache->size;
- ha_resize_key_cache();
- return 0;
+ if (!key_cache->cache)
+ return (bool)(ha_key_cache(key_cache));
+ else
+ return (bool)(ha_resize_key_cache(key_cache));
}
-static ulonglong zero=0;
-
-byte *sys_var_key_buffer_size::value_ptr(THD *thd, enum_var_type type,
- LEX_STRING *base)
+bool sys_var_key_cache_block_size::update(THD *thd, set_var *var)
{
- const char *name;
- uint length;
+ ulong tmp= var->value->val_int();
- if (!base->str)
- {
- name= "default";
- length= 7;
- }
- else
- {
- name= base->str;
- length= base->length;
- }
- KEY_CACHE *key_cache= (KEY_CACHE*) find_named(&key_caches, name, length);
- if (!key_cache)
- return (byte*) &zero;
- return (byte*) &key_cache->size;
+ if (!base_name.length)
+ base_name= default_key_cache_base;
+ KEY_CACHE_VAR *key_cache= get_key_cache(&base_name);
+
+ if (!key_cache && !(key_cache= create_key_cache(base_name.str,
+ base_name.length)))
+ return 1;
+
+ key_cache->block_size= (ulong) getopt_ull_limit_value(tmp, option_limits);
+
+ if (key_cache->cache)
+ /* Do not build a new key cache here */
+ return (bool) (ha_resize_key_cache(key_cache));
+ return 0;
}
-
/*****************************************************************************
@@ -2062,27 +2092,40 @@ void delete_elements(I_List<NAMED_LIST> *list, void (*free_element)(gptr))
/* Key cache functions */
-static KEY_CACHE *create_key_cache(const char *name, uint length)
+static KEY_CACHE_VAR *create_key_cache(const char *name, uint length)
{
- KEY_CACHE *key_cache;
+ KEY_CACHE_VAR *key_cache;
DBUG_PRINT("info",("Creating key cache: %s", name));
- if ((key_cache= (KEY_CACHE*) my_malloc(sizeof(KEY_CACHE),
- MYF(MY_ZEROFILL | MY_WME))))
+ if (length != default_key_cache_base.length ||
+ memcmp(name, default_key_cache_base.str, length))
{
- if (!new NAMED_LIST(&key_caches, name, length, (gptr) key_cache))
+ if ((key_cache= (KEY_CACHE_VAR*) my_malloc(sizeof(KEY_CACHE_VAR),
+ MYF(MY_ZEROFILL | MY_WME))))
{
- my_free((char*) key_cache, MYF(0));
- key_cache= 0;
+ if (!new NAMED_LIST(&key_caches, name, length, (gptr) key_cache))
+ {
+ my_free((char*) key_cache, MYF(0));
+ key_cache= 0;
+ }
}
}
+ else
+ {
+ key_cache= &dflt_key_cache_var;
+ if (!new NAMED_LIST(&key_caches, name, length, (gptr) key_cache))
+ key_cache= 0;
+ }
+
return key_cache;
}
-KEY_CACHE *get_or_create_key_cache(const char *name, uint length)
+KEY_CACHE_VAR *get_or_create_key_cache(const char *name, uint length)
{
- KEY_CACHE *key_cache= (KEY_CACHE*) find_named(&key_caches, name,
- length);
+ LEX_STRING key_cache_name;
+ key_cache_name.str= (char *) name;
+ key_cache_name.length= length;
+ KEY_CACHE_VAR *key_cache= get_key_cache(&key_cache_name);
if (!key_cache)
key_cache= create_key_cache(name, length);
return key_cache;
@@ -2091,7 +2134,22 @@ KEY_CACHE *get_or_create_key_cache(const char *name, uint length)
void free_key_cache(gptr key_cache)
{
- my_free(key_cache, MYF(0));
+ if (key_cache != (gptr) &dflt_key_cache_var)
+ my_free(key_cache, MYF(0));
+}
+
+bool process_key_caches(int (* func) (KEY_CACHE_VAR *))
+{
+
+ I_List_iterator<NAMED_LIST> it(key_caches);
+ NAMED_LIST *element;
+ while ((element= it++))
+ {
+ KEY_CACHE_VAR *key_cache= (KEY_CACHE_VAR *) element->data;
+ if (key_cache != &dflt_key_cache_var)
+ func(key_cache);
+ }
+ return 0;
}