~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/statement/drop_table.cc

  • Committer: Brian Aker
  • Date: 2009-11-26 18:50:02 UTC
  • mfrom: (1226.1.4 push)
  • Revision ID: brian@gaz-20091126185002-se908a2ceq9ub2rn
Mege of TableIdentifier gran patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include <drizzled/server_includes.h>
22
22
#include <drizzled/show.h>
23
23
#include <drizzled/session.h>
 
24
#include <drizzled/lock.h>
24
25
#include <drizzled/statement/drop_table.h>
25
26
 
26
27
namespace drizzled
27
28
{
28
29
 
 
30
 
 
31
/*
 
32
 delete (drop) tables.
 
33
 
 
34
  SYNOPSIS
 
35
   mysql_rm_table()
 
36
   session                      Thread handle
 
37
   tables               List of tables to delete
 
38
   if_exists            If 1, don't give error if one table doesn't exists
 
39
 
 
40
  NOTES
 
41
    Will delete all tables that can be deleted and give a compact error
 
42
    messages for tables that could not be deleted.
 
43
    If a table is in use, we will wait for all users to free the table
 
44
    before dropping it
 
45
 
 
46
    Wait if global_read_lock (FLUSH TABLES WITH READ LOCK) is set, but
 
47
    not if under LOCK TABLES.
 
48
 
 
49
  RETURN
 
50
    false OK.  In this case ok packet is sent to user
 
51
    true  Error
 
52
 
 
53
*/
 
54
 
 
55
static bool mysql_rm_table(Session *session, TableList *tables, bool if_exists, bool drop_temporary)
 
56
{
 
57
  bool error, need_start_waiting= false;
 
58
 
 
59
  if (tables && tables->schema_table)
 
60
  {
 
61
    my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), "", "", INFORMATION_SCHEMA_NAME.c_str());
 
62
    return true;
 
63
  }
 
64
 
 
65
  /* mark for close and remove all cached entries */
 
66
 
 
67
  if (! drop_temporary)
 
68
  {
 
69
    if (!(need_start_waiting= !wait_if_global_read_lock(session, false, true)))
 
70
      return true;
 
71
  }
 
72
 
 
73
  /*
 
74
    Acquire LOCK_open after wait_if_global_read_lock(). If we would hold
 
75
    LOCK_open during wait_if_global_read_lock(), other threads could not
 
76
    close their tables. This would make a pretty deadlock.
 
77
  */
 
78
  error= mysql_rm_table_part2(session, tables, if_exists, drop_temporary);
 
79
 
 
80
  if (need_start_waiting)
 
81
    start_waiting_global_read_lock(session);
 
82
 
 
83
  if (error)
 
84
    return true;
 
85
 
 
86
  session->my_ok();
 
87
 
 
88
  return false;
 
89
}
 
90
 
29
91
bool statement::DropTable::execute()
30
92
{
31
93
  TableList *first_table= (TableList *) session->lex->select_lex.table_list.first;
39
101
    }
40
102
  }
41
103
  /* DDL and binlog write order protected by LOCK_open */
42
 
  bool res= mysql_rm_table(session, 
43
 
                           first_table, 
44
 
                           drop_if_exists, 
 
104
  bool res= mysql_rm_table(session,
 
105
                           first_table,
 
106
                           drop_if_exists,
45
107
                           drop_temporary);
46
108
  return res;
47
109
}