summaryrefslogtreecommitdiff
path: root/sql/lock.cc
diff options
context:
space:
mode:
authorunknown <monty@donna.mysql.com>2000-08-21 03:00:52 +0300
committerunknown <monty@donna.mysql.com>2000-08-21 03:00:52 +0300
commit55c5016f92383fdf7cd14de4ef3ec5afbb89fd5a (patch)
treef46edbbf41f400440bde25519820b29885305b1b /sql/lock.cc
parent259c7ea0f84f25d82ec7b818e5b770f0bc7917d3 (diff)
downloadmariadb-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.cc84
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;
+}