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

new function for innodb

windows case insensitive tables name work around
parent c44c70fc
Loading
Loading
Loading
Loading
+34 −6
Original line number Diff line number Diff line
@@ -1104,6 +1104,28 @@ void Query_cache::invalidate(THD *thd, TABLE *table,
  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
*/
@@ -1356,8 +1378,15 @@ ulong Query_cache::init_cache()

  VOID(hash_init(&queries,def_query_hash_size, 0, 0,
		 query_cache_query_get_key, 0, 0));
#ifndef __WIN__
  VOID(hash_init(&tables,def_table_hash_size, 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_blocks = 0;
@@ -2828,7 +2857,6 @@ uint Query_cache::filename_2_table_key (char *key, const char *path,
			     filename) -key) + 1);
}


/****************************************************************************
  Functions to be used when debugging
****************************************************************************/
+2 −0
Original line number Diff line number Diff line
@@ -361,6 +361,8 @@ class Query_cache
		  my_bool using_transactions);
  void invalidate(CHANGED_TABLE_LIST *tables_used);
  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 */
  void invalidate(char *db);
+18 −13
Original line number Diff line number Diff line
@@ -301,28 +301,33 @@ void THD::add_changed_table(TABLE *table)

  DBUG_ASSERT((options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) &&
	      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* curr = transaction.changed_tables;

  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)
    {
      list_include(prev, curr, changed_table_dup(table));
      list_include(prev, curr, changed_table_dup(key, key_length));
      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;
    }
    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)
      {
	list_include(prev, curr, changed_table_dup(table));
	list_include(prev, curr, changed_table_dup(key, key_length));
	DBUG_PRINT("info", 
		   ("key_length %u %u", table->key_length,
		   ("key_length %u %u", key_length,
		    (*prev)->key_length));
	DBUG_VOID_RETURN;
      }
@@ -333,22 +338,22 @@ void THD::add_changed_table(TABLE *table)
      }
    }
  }
  *prev = changed_table_dup(table);
  DBUG_PRINT("info", ("key_length %u %u", table->key_length,
  *prev = changed_table_dup(key, key_length);
  DBUG_PRINT("info", ("key_length %u %u", key_length,
		      (*prev)->key_length));
  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*) trans_alloc(ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST))+
				      table->key_length + 1);
				      key_length + 1);
  if (!new_table)
  {
    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;
    return 0;
  }
@@ -356,8 +361,8 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(TABLE *table)
  new_table->key = (char *) (((byte*)new_table)+
			     ALIGN_SIZE(sizeof(CHANGED_TABLE_LIST)));
  new_table->next = 0;
  new_table->key_length = table->key_length;
  ::memcpy(new_table->key, table->table_cache_key, table->key_length);
  new_table->key_length = key_length;
  ::memcpy(new_table->key, key, key_length);
  return new_table;
}

+2 −1
Original line number Diff line number Diff line
@@ -550,7 +550,8 @@ class THD :public ilink {
    return alloc_root(&transaction.mem_root,size);
  }
  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);
};

/*