~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000-2006 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
/*
17
  Atomic rename of table;  RENAME TABLE t1 to t2, tmp to t1 [,...]
18
*/
243.1.17 by Jay Pipes
FINAL PHASE removal of mysql_priv.h (Bye, bye my friend.)
19
#include <drizzled/server_includes.h>
549 by Monty Taylor
Took gettext.h out of header files.
20
#include <drizzled/error.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
21
#include <drizzled/table_list.h>
22
#include <drizzled/session.h>
670.2.4 by Monty Taylor
Removed more stuff from the headers.
23
#include <drizzled/lock.h>
1 by brian
clean slate
24
520.1.22 by Brian Aker
Second pass of thd cleanup
25
static TableList *rename_tables(Session *session, TableList *table_list,
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
26
                                bool skip_error);
1 by brian
clean slate
27
327.2.4 by Brian Aker
Refactoring table.h
28
static TableList *reverse_table_list(TableList *table_list);
1 by brian
clean slate
29
30
/*
31
  Every second entry in the table_list is the original name and every
32
  second entry is the new name.
33
*/
575.2.2 by Monty Taylor
Moved vio stuff into libdrizzle.
34
bool drizzle_rename_tables(Session *session, TableList *table_list, bool silent)
1 by brian
clean slate
35
{
36
  bool error= 1;
327.2.4 by Brian Aker
Refactoring table.h
37
  TableList *ren_table= 0;
1 by brian
clean slate
38
39
  /*
40
    Avoid problems with a rename on a table that we have locked or
41
    if the user is trying to to do this in a transcation context
42
  */
934.2.28 by Jay Pipes
Renamed some things to our standards and made private methods private...
43
  if (session->locked_tables || session->inTransaction())
1 by brian
clean slate
44
  {
934.2.28 by Jay Pipes
Renamed some things to our standards and made private methods private...
45
    my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
46
    return(1);
1 by brian
clean slate
47
  }
48
520.1.22 by Brian Aker
Second pass of thd cleanup
49
  if (wait_if_global_read_lock(session,0,1))
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
50
    return(1);
1 by brian
clean slate
51
52
  pthread_mutex_lock(&LOCK_open);
520.1.22 by Brian Aker
Second pass of thd cleanup
53
  if (lock_table_names_exclusively(session, table_list))
1 by brian
clean slate
54
  {
55
    pthread_mutex_unlock(&LOCK_open);
56
    goto err;
57
  }
58
59
  error=0;
520.1.22 by Brian Aker
Second pass of thd cleanup
60
  if ((ren_table=rename_tables(session,table_list,0)))
1 by brian
clean slate
61
  {
62
    /* Rename didn't succeed;  rename back the tables in reverse order */
327.2.4 by Brian Aker
Refactoring table.h
63
    TableList *table;
1 by brian
clean slate
64
65
    /* Reverse the table list */
66
    table_list= reverse_table_list(table_list);
67
68
    /* Find the last renamed table */
69
    for (table= table_list;
70
	 table->next_local != ren_table ;
71
	 table= table->next_local->next_local) ;
72
    table= table->next_local->next_local;		// Skip error table
73
    /* Revert to old names */
520.1.22 by Brian Aker
Second pass of thd cleanup
74
    rename_tables(session, table, 1);
1 by brian
clean slate
75
76
    /* Revert the table list (for prepared statements) */
77
    table_list= reverse_table_list(table_list);
78
79
    error= 1;
80
  }
81
  /*
82
    An exclusive lock on table names is satisfactory to ensure
83
    no other thread accesses this table.
84
    We still should unlock LOCK_open as early as possible, to provide
85
    higher concurrency - query_cache_invalidate can take minutes to
86
    complete.
87
  */
88
  pthread_mutex_unlock(&LOCK_open);
89
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
90
  /* Lets hope this doesn't fail as the result will be messy */
1 by brian
clean slate
91
  if (!silent && !error)
92
  {
520.1.22 by Brian Aker
Second pass of thd cleanup
93
    write_bin_log(session, true, session->query, session->query_length);
836 by Brian Aker
Fixed session call from function to method.
94
    session->my_ok();
1 by brian
clean slate
95
  }
96
97
  pthread_mutex_lock(&LOCK_open);
1017 by Brian Aker
Drop dead session pass
98
  unlock_table_names(table_list, (TableList*) 0);
1 by brian
clean slate
99
  pthread_mutex_unlock(&LOCK_open);
100
101
err:
520.1.22 by Brian Aker
Second pass of thd cleanup
102
  start_waiting_global_read_lock(session);
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
103
  return(error);
1 by brian
clean slate
104
}
105
106
107
/*
108
  reverse table list
109
110
  SYNOPSIS
111
    reverse_table_list()
112
    table_list pointer to table _list
113
114
  RETURN
115
    pointer to new (reversed) list
116
*/
327.2.4 by Brian Aker
Refactoring table.h
117
static TableList *reverse_table_list(TableList *table_list)
1 by brian
clean slate
118
{
327.2.4 by Brian Aker
Refactoring table.h
119
  TableList *prev= 0;
1 by brian
clean slate
120
121
  while (table_list)
122
  {
327.2.4 by Brian Aker
Refactoring table.h
123
    TableList *next= table_list->next_local;
1 by brian
clean slate
124
    table_list->next_local= prev;
125
    prev= table_list;
126
    table_list= next;
127
  }
128
  return (prev);
129
}
130
131
132
/*
133
  Rename a single table or a view
134
135
  SYNPOSIS
136
    do_rename()
520.1.22 by Brian Aker
Second pass of thd cleanup
137
      session               Thread handle
1 by brian
clean slate
138
      ren_table         A table/view to be renamed
139
      new_db            The database to which the table to be moved to
140
      new_table_name    The new table/view name
141
      new_table_alias   The new table/view alias
142
      skip_error        Whether to skip error
143
144
  DESCRIPTION
145
    Rename a single table or a view.
146
147
  RETURN
148
    false     Ok
149
    true      rename failed
150
*/
151
152
bool
520.1.22 by Brian Aker
Second pass of thd cleanup
153
do_rename(Session *session, TableList *ren_table, char *new_db, char *new_table_name,
1 by brian
clean slate
154
          char *new_table_alias, bool skip_error)
155
{
156
  int rc= 1;
157
  const char *new_alias, *old_alias;
158
159
  if (lower_case_table_names == 2)
160
  {
161
    old_alias= ren_table->alias;
162
    new_alias= new_table_alias;
163
  }
164
  else
165
  {
166
    old_alias= ren_table->table_name;
167
    new_alias= new_table_name;
168
  }
673.3.2 by Stewart Smith
start replacing calles to access(2) on frm file name with calls to ha_table_exists_in_engine
169
960.2.26 by Monty Taylor
Rename hton to engine.
170
  StorageEngine *engine= NULL;
673.3.12 by Stewart Smith
fix RENAME TABLE
171
960.2.26 by Monty Taylor
Rename hton to engine.
172
  if(ha_table_exists_in_engine(session, ren_table->db, old_alias, &engine)
673.3.12 by Stewart Smith
fix RENAME TABLE
173
     != HA_ERR_TABLE_EXIST)
174
  {
175
    my_error(ER_NO_SUCH_TABLE, MYF(0), ren_table->db, old_alias);
176
    return(1);
177
  }
178
673.3.2 by Stewart Smith
start replacing calles to access(2) on frm file name with calls to ha_table_exists_in_engine
179
  if (ha_table_exists_in_engine(session, new_db, new_alias)
180
      !=HA_ERR_NO_SUCH_TABLE)
1 by brian
clean slate
181
  {
182
    my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
183
    return(1);			// This can't be skipped
1 by brian
clean slate
184
  }
185
960.2.26 by Monty Taylor
Rename hton to engine.
186
  rc= mysql_rename_table(engine,
673.3.12 by Stewart Smith
fix RENAME TABLE
187
                         ren_table->db, old_alias,
188
                         new_db, new_alias, 0);
1 by brian
clean slate
189
  if (rc && !skip_error)
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
190
    return(1);
1 by brian
clean slate
191
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
192
  return(0);
1 by brian
clean slate
193
194
}
195
/*
196
  Rename all tables in list; Return pointer to wrong entry if something goes
197
  wrong.  Note that the table_list may be empty!
198
*/
199
200
/*
201
  Rename tables/views in the list
202
203
  SYNPOSIS
204
    rename_tables()
520.1.22 by Brian Aker
Second pass of thd cleanup
205
      session               Thread handle
1 by brian
clean slate
206
      table_list        List of tables to rename
207
      skip_error        Whether to skip errors
208
209
  DESCRIPTION
210
    Take a table/view name from and odd list element and rename it to a
211
    the name taken from list element+1. Note that the table_list may be
212
    empty.
213
214
  RETURN
215
    false     Ok
216
    true      rename failed
217
*/
218
327.2.4 by Brian Aker
Refactoring table.h
219
static TableList *
520.1.22 by Brian Aker
Second pass of thd cleanup
220
rename_tables(Session *session, TableList *table_list, bool skip_error)
1 by brian
clean slate
221
{
327.2.4 by Brian Aker
Refactoring table.h
222
  TableList *ren_table, *new_table;
1 by brian
clean slate
223
224
  for (ren_table= table_list; ren_table; ren_table= new_table->next_local)
225
  {
226
    new_table= ren_table->next_local;
520.1.22 by Brian Aker
Second pass of thd cleanup
227
    if (do_rename(session, ren_table, new_table->db, new_table->table_name,
1 by brian
clean slate
228
                  new_table->alias, skip_error))
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
229
      return(ren_table);
1 by brian
clean slate
230
  }
51.1.63 by Jay Pipes
Removed/replaced BUG symbols and standardized TRUE/FALSE. Removed dbug-only server option
231
  return(0);
1 by brian
clean slate
232
}