~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/rename.cc

  • Committer: Toru Maesaka
  • Date: 2008-12-17 07:16:37 UTC
  • mto: (685.1.40 devel) (713.1.5 devel)
  • mto: This revision was merged to the branch mainline in revision 713.
  • Revision ID: dev@torum.net-20081217071637-7j9040w7lpms77r2
Removed my_time() and added error checking

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
  Atomic rename of table;  RENAME TABLE t1 to t2, tmp to t1 [,...]
18
18
*/
19
19
#include <drizzled/server_includes.h>
20
 
#include <drizzled/drizzled_error_messages.h>
 
20
#include <drizzled/error.h>
 
21
#include <drizzled/table_list.h>
 
22
#include <drizzled/session.h>
 
23
#include <drizzled/lock.h>
21
24
 
22
 
static TableList *rename_tables(THD *thd, TableList *table_list,
23
 
                                 bool skip_error);
 
25
static TableList *rename_tables(Session *session, TableList *table_list,
 
26
                                bool skip_error);
24
27
 
25
28
static TableList *reverse_table_list(TableList *table_list);
26
29
 
29
32
  second entry is the new name.
30
33
*/
31
34
 
32
 
bool mysql_rename_tables(THD *thd, TableList *table_list, bool silent)
 
35
bool drizzle_rename_tables(Session *session, TableList *table_list, bool silent)
33
36
{
34
37
  bool error= 1;
35
38
  TableList *ren_table= 0;
38
41
    Avoid problems with a rename on a table that we have locked or
39
42
    if the user is trying to to do this in a transcation context
40
43
  */
41
 
  if (thd->locked_tables || thd->active_transaction())
 
44
  if (session->locked_tables || session->active_transaction())
42
45
  {
43
46
    my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
44
47
               ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
45
48
    return(1);
46
49
  }
47
50
 
48
 
  mysql_ha_rm_tables(thd, table_list, false);
 
51
  mysql_ha_rm_tables(session, table_list, false);
49
52
 
50
 
  if (wait_if_global_read_lock(thd,0,1))
 
53
  if (wait_if_global_read_lock(session,0,1))
51
54
    return(1);
52
55
 
53
56
  pthread_mutex_lock(&LOCK_open);
54
 
  if (lock_table_names_exclusively(thd, table_list))
 
57
  if (lock_table_names_exclusively(session, table_list))
55
58
  {
56
59
    pthread_mutex_unlock(&LOCK_open);
57
60
    goto err;
58
61
  }
59
62
 
60
63
  error=0;
61
 
  if ((ren_table=rename_tables(thd,table_list,0)))
 
64
  if ((ren_table=rename_tables(session,table_list,0)))
62
65
  {
63
66
    /* Rename didn't succeed;  rename back the tables in reverse order */
64
67
    TableList *table;
72
75
         table= table->next_local->next_local) ;
73
76
    table= table->next_local->next_local;               // Skip error table
74
77
    /* Revert to old names */
75
 
    rename_tables(thd, table, 1);
 
78
    rename_tables(session, table, 1);
76
79
 
77
80
    /* Revert the table list (for prepared statements) */
78
81
    table_list= reverse_table_list(table_list);
88
91
  */
89
92
  pthread_mutex_unlock(&LOCK_open);
90
93
 
91
 
  /* Lets hope this doesn't fail as the result will be messy */ 
 
94
  /* Lets hope this doesn't fail as the result will be messy */
92
95
  if (!silent && !error)
93
96
  {
94
 
    write_bin_log(thd, true, thd->query, thd->query_length);
95
 
    my_ok(thd);
 
97
    write_bin_log(session, true, session->query, session->query_length);
 
98
    my_ok(session);
96
99
  }
97
100
 
98
101
  pthread_mutex_lock(&LOCK_open);
99
 
  unlock_table_names(thd, table_list, (TableList*) 0);
 
102
  unlock_table_names(session, table_list, (TableList*) 0);
100
103
  pthread_mutex_unlock(&LOCK_open);
101
104
 
102
105
err:
103
 
  start_waiting_global_read_lock(thd);
 
106
  start_waiting_global_read_lock(session);
104
107
  return(error);
105
108
}
106
109
 
135
138
 
136
139
  SYNPOSIS
137
140
    do_rename()
138
 
      thd               Thread handle
 
141
      session               Thread handle
139
142
      ren_table         A table/view to be renamed
140
143
      new_db            The database to which the table to be moved to
141
144
      new_table_name    The new table/view name
151
154
*/
152
155
 
153
156
bool
154
 
do_rename(THD *thd, TableList *ren_table, char *new_db, char *new_table_name,
 
157
do_rename(Session *session, TableList *ren_table, char *new_db, char *new_table_name,
155
158
          char *new_table_alias, bool skip_error)
156
159
{
157
160
  int rc= 1;
181
184
  build_table_filename(name, sizeof(name),
182
185
                       ren_table->db, old_alias, reg_ext, 0);
183
186
 
184
 
  rc= mysql_rename_table(ha_resolve_by_legacy_type(thd, table_type),
 
187
  rc= mysql_rename_table(ha_resolve_by_legacy_type(session, table_type),
185
188
                               ren_table->db, old_alias,
186
189
                               new_db, new_alias, 0);
187
190
  if (rc && !skip_error)
200
203
 
201
204
  SYNPOSIS
202
205
    rename_tables()
203
 
      thd               Thread handle
 
206
      session               Thread handle
204
207
      table_list        List of tables to rename
205
208
      skip_error        Whether to skip errors
206
209
 
215
218
*/
216
219
 
217
220
static TableList *
218
 
rename_tables(THD *thd, TableList *table_list, bool skip_error)
 
221
rename_tables(Session *session, TableList *table_list, bool skip_error)
219
222
{
220
223
  TableList *ren_table, *new_table;
221
224
 
222
225
  for (ren_table= table_list; ren_table; ren_table= new_table->next_local)
223
226
  {
224
227
    new_table= ren_table->next_local;
225
 
    if (do_rename(thd, ren_table, new_table->db, new_table->table_name,
 
228
    if (do_rename(session, ren_table, new_table->db, new_table->table_name,
226
229
                  new_table->alias, skip_error))
227
230
      return(ren_table);
228
231
  }