diff options
author | unknown <monty@donna.mysql.com> | 2000-08-21 03:00:52 +0300 |
---|---|---|
committer | unknown <monty@donna.mysql.com> | 2000-08-21 03:00:52 +0300 |
commit | 55c5016f92383fdf7cd14de4ef3ec5afbb89fd5a (patch) | |
tree | f46edbbf41f400440bde25519820b29885305b1b /sql/lock.cc | |
parent | 259c7ea0f84f25d82ec7b818e5b770f0bc7917d3 (diff) | |
download | mariadb-git-55c5016f92383fdf7cd14de4ef3ec5afbb89fd5a.tar.gz |
RENAME TABLE table_name TO new_table_name ; Faster Alloc
Small bug fixes
myisammrg/myrg_rfirst.c:
Change mode to -rw-rw-r--
myisammrg/myrg_rlast.c:
Change mode to -rw-rw-r--
myisammrg/myrg_rnext.c:
Change mode to -rw-rw-r--
myisammrg/myrg_rprev.c:
Change mode to -rw-rw-r--
Docs/manual.texi:
Update of RENAME
configure.in:
Portability fix
include/global.h:
Fix for ODBC and Intel Ia64
include/mysqld_error.h:
RENAME TABLE
myisam/myisamchk.c:
Faster --fast
myisammrg/myrg_queue.c:
Bug fix
myisammrg/myrg_rkey.c:
Portability fix
sql-bench/test-insert.sh:
Fix for duplicate key test
sql/ChangeLog:
Changelog
sql/Makefile.am:
RENAME TABLE
sql/item_sum.cc:
Fix for COUNT(DISTINCT)
sql/lock.cc:
RENAME TABLE
sql/share/czech/errmsg.sys:
RENAME TABLE
sql/share/czech/errmsg.txt:
RENAME TABLE
sql/share/danish/errmsg.sys:
RENAME TABLE
sql/share/danish/errmsg.txt:
RENAME TABLE
sql/share/dutch/errmsg.sys:
RENAME TABLE
sql/share/dutch/errmsg.txt:
RENAME TABLE
sql/share/english/errmsg.sys:
RENAME TABLE
sql/share/english/errmsg.txt:
RENAME TABLE
sql/share/estonia/errmsg.sys:
RENAME TABLE
sql/share/estonia/errmsg.txt:
RENAME TABLE
sql/share/french/errmsg.sys:
RENAME TABLE
sql/share/french/errmsg.txt:
RENAME TABLE
sql/share/german/errmsg.sys:
RENAME TABLE
sql/share/german/errmsg.txt:
RENAME TABLE
sql/share/greek/errmsg.sys:
RENAME TABLE
sql/share/greek/errmsg.txt:
RENAME TABLE
sql/share/hungarian/errmsg.sys:
RENAME TABLE
sql/share/hungarian/errmsg.txt:
RENAME TABLE
sql/share/italian/errmsg.sys:
RENAME TABLE
sql/share/italian/errmsg.txt:
RENAME TABLE
sql/share/japanese/errmsg.sys:
RENAME TABLE
sql/share/japanese/errmsg.txt:
RENAME TABLE
sql/share/korean/errmsg.sys:
RENAME TABLE
sql/share/korean/errmsg.txt:
RENAME TABLE
sql/share/norwegian-ny/errmsg.txt:
RENAME TABLE
sql/share/norwegian/errmsg.txt:
RENAME TABLE
sql/share/polish/errmsg.sys:
RENAME TABLE
sql/share/polish/errmsg.txt:
RENAME TABLE
sql/share/portuguese/errmsg.sys:
RENAME TABLE
sql/share/portuguese/errmsg.txt:
RENAME TABLE
sql/share/romania/errmsg.sys:
RENAME TABLE
sql/share/romania/errmsg.txt:
RENAME TABLE
sql/share/romanian/errmsg.txt:
***MISSING WEAVE***
sql/share/russian/errmsg.sys:
RENAME TABLE
sql/share/russian/errmsg.txt:
RENAME TABLE
sql/share/slovak/errmsg.sys:
RENAME TABLE
sql/share/slovak/errmsg.txt:
RENAME TABLE
sql/share/spanish/errmsg.sys:
RENAME TABLE
sql/share/spanish/errmsg.txt:
RENAME TABLE
sql/share/swedish/errmsg.OLD:
RENAME TABLE
sql/share/swedish/errmsg.sys:
RENAME TABLE
sql/share/swedish/errmsg.txt:
RENAME TABLE
sql/slave.cc:
Faster alloc
sql/sql_base.cc:
RENAME TABLE
sql/sql_class.cc:
Faster alloc
sql/sql_class.h:
Faster alloc
sql/sql_insert.cc:
Fix bug in INSERT ... SELECT to BDB table
sql/sql_lex.h:
RENAME TABLE
sql/sql_select.cc:
Faster alloc
sql/sql_show.cc:
Faster alloc
sql/sql_table.cc:
RENAME TABLE
sql/sql_yacc.yy:
RENAME TABLE
sql/thr_malloc.cc:
Faster alloc
sql/unireg.h:
RENAME TABLE
strings/ctype-sjis.c:
Portability fix
Diffstat (limited to 'sql/lock.cc')
-rw-r--r-- | sql/lock.cc | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/sql/lock.cc b/sql/lock.cc index b65ae5ddc3e..be942c2ec78 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -384,3 +384,87 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count, } return sql_lock; } + +/***************************************************************************** +** Lock table based on the name. +** This is used when we need total access to a closed, not open table +*****************************************************************************/ + +/* + Put a not open table with an old refresh version in the table cache. + This will force any other threads that uses the table to release it + as soon as possible. + One must have a lock on LOCK_open ! + Return values: + < 0 error + == 0 table locked + > 0 table locked, but someone is using it +*/ + + +int lock_table_name(THD *thd, TABLE_LIST *table_list) +{ + TABLE *table; + char key[MAX_DBKEY_LENGTH]; + uint key_length; + key_length=(uint) (strmov(strmov(key,table_list->db)+1,table_list->name)-key)+ + 1; + + /* Only insert the table if we haven't insert it already */ + for (table=(TABLE*) hash_search(&open_cache,(byte*) key,key_length) ; + table ; + table = (TABLE*) hash_next(&open_cache,(byte*) key,key_length)) + if (table->in_use == thd) + return 0; + + /* Create a table entry with the right key and with an old refresh version */ + if (!(table= (TABLE*) thd->calloc(sizeof(*table)+key_length))) + return -1; + memcpy((table->table_cache_key= (char*) (table+1)), key, key_length); + table->key_length=key_length; + table->in_use=thd; + table_list->table=table; + + if (hash_insert(&open_cache, (byte*) table)) + return -1; + if (remove_table_from_cache(thd, table_list->db, table_list->name)) + return 1; // Table is in use + return 0; +} + +void unlock_table_name(THD *thd, TABLE_LIST *table_list) +{ + if (table_list->table) + hash_delete(&open_cache, (gptr) table_list->table); +} + +static bool locked_named_table(THD *thd, TABLE_LIST *table_list) +{ + for ( ; table_list ; table_list=table_list->next) + { + if (table_list->table && table_is_used(table_list->table)) + return 1; + } + return 0; // All tables are locked +} + + +bool wait_for_locked_table_names(THD *thd, TABLE_LIST *table_list) +{ + bool result=0; + + while (locked_named_table(thd,table_list)) + { + if (thd->killed) + { + result=1; + break; + } + wait_for_refresh(thd); + } + pthread_mutex_lock(&thd->mysys_var->mutex); + thd->mysys_var->current_mutex=0; + thd->mysys_var->current_cond=0; + pthread_mutex_unlock(&thd->mysys_var->mutex); + return result; +} |