Commit f751ab1a authored by serg@serg.mysql.com's avatar serg@serg.mysql.com
Browse files

fully functional HANDLER table CLOSE

parent 4fbab1d6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -430,6 +430,7 @@ bool send_fields(THD *thd,List<Item> &item,uint send_field_count);
void free_io_cache(TABLE *entry);
void intern_close_table(TABLE *entry);
void close_thread_tables(THD *thd,bool locked=0);
bool close_thread_table(THD *thd, TABLE **table_ptr);
void close_temporary_tables(THD *thd);
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name);
bool close_temporary_table(THD *thd, const char *db, const char *table_name);
+45 −34
Original line number Diff line number Diff line
@@ -421,9 +421,34 @@ void close_thread_tables(THD *thd, bool locked)

  DBUG_PRINT("info", ("thd->open_tables=%p", thd->open_tables));

  for (table=thd->open_tables ; table ; table=next)
  while (thd->open_tables)
    found_old_table|=close_thread_table(thd, &thd->open_tables);

  /* Free tables to hold down open files */
  while (open_cache.records > table_cache_size && unused_tables)
    VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
  check_unused();
  if (found_old_table)
  {
    next=table->next;
    /* Tell threads waiting for refresh that something has happened */
    VOID(pthread_cond_broadcast(&COND_refresh));
  }
  if (!locked)
    VOID(pthread_mutex_unlock(&LOCK_open));
  /*  VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */
  DBUG_VOID_RETURN;
}

/* move one table to free list */

bool close_thread_table(THD *thd, TABLE **table_ptr)
{
  DBUG_ENTER("close_thread_table");

  bool found_old_table=0;
  TABLE *table=*table_ptr;

  *table_ptr=table->next;
  if (table->version != refresh_version ||
      thd->version != refresh_version || !table->db_stat)
  {
@@ -453,21 +478,7 @@ void close_thread_tables(THD *thd, bool locked)
    else
      unused_tables=table->next=table->prev=table;
  }
  }
  thd->open_tables=0;
  /* Free tables to hold down open files */
  while (open_cache.records > table_cache_size && unused_tables)
    VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
  check_unused();
  if (found_old_table)
  {
    /* Tell threads waiting for refresh that something has happened */
    VOID(pthread_cond_broadcast(&COND_refresh));
  }
  if (!locked)
    VOID(pthread_mutex_unlock(&LOCK_open));
  /*  VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */
  DBUG_VOID_RETURN;
  DBUG_RETURN(found_old_table);
}

	/* Close and delete temporary tables */
+14 −11
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@
  thd->open_tables=thd->handler_tables; \
  thd->handler_tables=tmp; }

static TABLE *find_table_by_name(THD *thd, char *db, char *table_name);
static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name);

int mysql_ha_open(THD *thd, TABLE_LIST *tables)
{
@@ -59,11 +59,11 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables)

int mysql_ha_close(THD *thd, TABLE_LIST *tables)
{
  /* Perhaps, we should close table here.
     But it's not easy - *tables is a single-linked list, designed
     to be closed at all once.
     So, why bother ? All the tables will be closed at thread exit.
   */
  TABLE **ptr=find_table_ptr_by_name(thd, tables->db, tables->name);

  if (*ptr)
    close_thread_table(thd, ptr);
  
  send_ok(&thd->net);
  return 0;
}
@@ -77,7 +77,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
    ha_rows select_limit,ha_rows offset_limit)
{
  int err, keyno=-1;
  TABLE *table=find_table_by_name(thd, tables->db, tables->name);
  TABLE *table=*find_table_ptr_by_name(thd, tables->db, tables->name);
  if (!table)
  {
    my_printf_error(ER_UNKNOWN_TABLE,ER(ER_UNKNOWN_TABLE),MYF(0),
@@ -231,19 +231,22 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
/* Note: this function differs from find_locked_table() because we're looking
   here for alias, not real table name 
 */
static TABLE *find_table_by_name(THD *thd, char *db, char *table_name)
static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name)
{
  int dblen;
  TABLE **ptr;
  
  if (!db || ! *db) db=thd->db;
  if (!db || ! *db) db="";
  dblen=strlen(db);  
  ptr=&(thd->handler_tables);
  
  for (TABLE *table=thd->handler_tables; table ; table=table->next)
  for (TABLE *table=*ptr; table ; table=*ptr)
  {
    if (!memcmp(table->table_cache_key, db, dblen) &&
        !my_strcasecmp(table->table_name,table_name))
      return table;
      break;
    ptr=&(table->next);
  }
  return(0);
  return ptr;
}