Commit 96ebe381 authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

new function for innodb

windows case insensitive tables name work around
parent c44c70fc
...@@ -708,11 +708,11 @@ Query_cache::Query_cache(ulong query_cache_limit, ...@@ -708,11 +708,11 @@ Query_cache::Query_cache(ulong query_cache_limit,
def_table_hash_size(ALIGN_SIZE(def_table_hash_size)), def_table_hash_size(ALIGN_SIZE(def_table_hash_size)),
initialized(0) initialized(0)
{ {
ulong min_needed=(ALIGN_SIZE(sizeof(Query_cache_block)) + ulong min_needed= (ALIGN_SIZE(sizeof(Query_cache_block)) +
ALIGN_SIZE(sizeof(Query_cache_block_table)) + ALIGN_SIZE(sizeof(Query_cache_block_table)) +
ALIGN_SIZE(sizeof(Query_cache_query)) + 3); ALIGN_SIZE(sizeof(Query_cache_query)) + 3);
set_if_bigger(min_allocation_unit,min_needed); set_if_bigger(min_allocation_unit,min_needed);
this->min_allocation_unit = ALIGN_SIZE(min_allocation_unit); this->min_allocation_unit= ALIGN_SIZE(min_allocation_unit);
set_if_bigger(this->min_result_data_size,min_allocation_unit); set_if_bigger(this->min_result_data_size,min_allocation_unit);
} }
...@@ -723,7 +723,7 @@ ulong Query_cache::resize(ulong query_cache_size_arg) ...@@ -723,7 +723,7 @@ ulong Query_cache::resize(ulong query_cache_size_arg)
DBUG_PRINT("qcache", ("from %lu to %lu",query_cache_size, DBUG_PRINT("qcache", ("from %lu to %lu",query_cache_size,
query_cache_size_arg)); query_cache_size_arg));
free_cache(0); free_cache(0);
query_cache_size=query_cache_size_arg; query_cache_size= query_cache_size_arg;
DBUG_RETURN(init_cache()); DBUG_RETURN(init_cache());
} }
...@@ -1104,6 +1104,28 @@ void Query_cache::invalidate(THD *thd, TABLE *table, ...@@ -1104,6 +1104,28 @@ void Query_cache::invalidate(THD *thd, TABLE *table,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
void Query_cache::invalidate(THD *thd, const char *key, uint32 key_length,
my_bool using_transactions)
{
DBUG_ENTER("Query_cache::invalidate (key)");
if (query_cache_size > 0)
{
using_transactions = using_transactions &&
(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN));
if (using_transactions) // used for innodb => has_transactions() is TRUE
thd->add_changed_table(key, key_length);
else
{
STRUCT_LOCK(&structure_guard_mutex);
if (query_cache_size > 0)
invalidate_table((byte*)key, key_length);
STRUCT_UNLOCK(&structure_guard_mutex);
}
}
DBUG_VOID_RETURN;
}
/* /*
Remove all cached queries that uses the given database Remove all cached queries that uses the given database
*/ */
...@@ -1356,8 +1378,15 @@ ulong Query_cache::init_cache() ...@@ -1356,8 +1378,15 @@ ulong Query_cache::init_cache()
VOID(hash_init(&queries,def_query_hash_size, 0, 0, VOID(hash_init(&queries,def_query_hash_size, 0, 0,
query_cache_query_get_key, 0, 0)); query_cache_query_get_key, 0, 0));
#ifndef __WIN__
VOID(hash_init(&tables,def_table_hash_size, 0, 0, VOID(hash_init(&tables,def_table_hash_size, 0, 0,
query_cache_table_get_key, 0, 0)); query_cache_table_get_key, 0, 0));
#else
// windows case insensitive file names work around
VOID(hash_init(&tables,def_table_hash_size, 0, 0,
query_cache_table_get_key, 0,
(lower_case_table_names?0:HASH_CASE_INSENSITIVE)));
#endif
queries_in_cache = 0; queries_in_cache = 0;
queries_blocks = 0; queries_blocks = 0;
...@@ -2828,7 +2857,6 @@ uint Query_cache::filename_2_table_key (char *key, const char *path, ...@@ -2828,7 +2857,6 @@ uint Query_cache::filename_2_table_key (char *key, const char *path,
filename) -key) + 1); filename) -key) + 1);
} }
/**************************************************************************** /****************************************************************************
Functions to be used when debugging Functions to be used when debugging
****************************************************************************/ ****************************************************************************/
......
...@@ -361,6 +361,8 @@ protected: ...@@ -361,6 +361,8 @@ protected:
my_bool using_transactions); my_bool using_transactions);
void invalidate(CHANGED_TABLE_LIST *tables_used); void invalidate(CHANGED_TABLE_LIST *tables_used);
void invalidate(THD* thd, TABLE *table, my_bool using_transactions); void invalidate(THD* thd, TABLE *table, my_bool using_transactions);
void invalidate(THD *thd, const char *key, uint32 key_length,
my_bool using_transactions);
/* Remove all queries that uses any of the tables in following database */ /* Remove all queries that uses any of the tables in following database */
void invalidate(char *db); void invalidate(char *db);
......
...@@ -301,28 +301,33 @@ void THD::add_changed_table(TABLE *table) ...@@ -301,28 +301,33 @@ void THD::add_changed_table(TABLE *table)
DBUG_ASSERT((options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && DBUG_ASSERT((options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&
table->file->has_transactions()); table->file->has_transactions());
DBUG_RETURN(add_changed_table(table->table_cache_key, table->key_length));
}
void THD::add_changed_table(const char *key, long key_length)
{
DBUG_ENTER("THD::add_changed_table(key)");
CHANGED_TABLE_LIST** prev = &transaction.changed_tables; CHANGED_TABLE_LIST** prev = &transaction.changed_tables;
CHANGED_TABLE_LIST* curr = transaction.changed_tables; CHANGED_TABLE_LIST* curr = transaction.changed_tables;
for (; curr; prev = &(curr->next), curr = curr->next) for (; curr; prev = &(curr->next), curr = curr->next)
{ {
int cmp = (long)curr->key_length - (long)table->key_length; int cmp = (long)curr->key_length - (long)key_length;
if (cmp < 0) if (cmp < 0)
{ {
list_include(prev, curr, changed_table_dup(table)); list_include(prev, curr, changed_table_dup(key, key_length));
DBUG_PRINT("info", DBUG_PRINT("info",
("key_length %u %u", table->key_length, (*prev)->key_length)); ("key_length %u %u", key_length, (*prev)->key_length));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
else if (cmp == 0) else if (cmp == 0)
{ {
cmp = memcmp(curr->key ,table->table_cache_key, curr->key_length); cmp = memcmp(curr->key, key, curr->key_length);
if (cmp < 0) if (cmp < 0)
{ {
list_include(prev, curr, changed_table_dup(table)); list_include(prev, curr, changed_table_dup(key, key_length));
DBUG_PRINT("info", DBUG_PRINT("info",
("key_length %u %u", table->key_length, ("key_length %u %u", key_length,
(*prev)->key_length)); (*prev)->key_length));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -333,22 +338,22 @@ void THD::add_changed_table(TABLE *table) ...@@ -333,22 +338,22 @@ void THD::add_changed_table(TABLE *table)
} }
} }
} }
*prev = changed_table_dup(table); *prev = changed_table_dup(key, key_length);
DBUG_PRINT("info", ("key_length %u %u", table->key_length, DBUG_PRINT("info", ("key_length %u %u", key_length,
(*prev)->key_length)); (*prev)->key_length));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
CHANGED_TABLE_LIST* THD::changed_table_dup(TABLE *table) CHANGED_TABLE_LIST* THD::changed_table_dup(const char *key, long key_length)
{ {
CHANGED_TABLE_LIST* new_table = CHANGED_TABLE_LIST* new_table =
(CHANGED_TABLE_LIST*) trans_alloc(ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST))+ (CHANGED_TABLE_LIST*) trans_alloc(ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST))+
table->key_length + 1); key_length + 1);
if (!new_table) if (!new_table)
{ {
my_error(EE_OUTOFMEMORY, MYF(ME_BELL), my_error(EE_OUTOFMEMORY, MYF(ME_BELL),
ALIGN_SIZE(sizeof(TABLE_LIST)) + table->key_length + 1); ALIGN_SIZE(sizeof(TABLE_LIST)) + key_length + 1);
killed= 1; killed= 1;
return 0; return 0;
} }
...@@ -356,8 +361,8 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(TABLE *table) ...@@ -356,8 +361,8 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(TABLE *table)
new_table->key = (char *) (((byte*)new_table)+ new_table->key = (char *) (((byte*)new_table)+
ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST))); ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST)));
new_table->next = 0; new_table->next = 0;
new_table->key_length = table->key_length; new_table->key_length = key_length;
::memcpy(new_table->key, table->table_cache_key, table->key_length); ::memcpy(new_table->key, key, key_length);
return new_table; return new_table;
} }
......
...@@ -550,7 +550,8 @@ public: ...@@ -550,7 +550,8 @@ public:
return alloc_root(&transaction.mem_root,size); return alloc_root(&transaction.mem_root,size);
} }
void add_changed_table(TABLE *table); void add_changed_table(TABLE *table);
CHANGED_TABLE_LIST * changed_table_dup(TABLE *table); void add_changed_table(const char *key, long key_length);
CHANGED_TABLE_LIST * changed_table_dup(const char *key, long key_length);
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment