00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include <drizzled/show.h>
00024 #include <drizzled/session.h>
00025 #include <drizzled/statement/drop_schema.h>
00026 #include <drizzled/plugin/event_observer.h>
00027 #include <drizzled/sql_lex.h>
00028 #include <drizzled/schema.h>
00029
00030 #include <string>
00031
00032 using namespace std;
00033
00034 namespace drizzled
00035 {
00036
00037 bool statement::DropSchema::execute()
00038 {
00039 if (session().inTransaction())
00040 {
00041 my_error(ER_TRANSACTIONAL_DDL_NOT_SUPPORTED, MYF(0));
00042 return true;
00043 }
00044
00045 identifier::Schema schema_identifier(std::string(lex().name.str, lex().name.length));
00046
00047 if (not schema::check(session(), schema_identifier))
00048 {
00049 my_error(ER_WRONG_DB_NAME, schema_identifier);
00050
00051 return false;
00052 }
00053
00054 if (session().inTransaction())
00055 {
00056 my_message(ER_LOCK_OR_ACTIVE_TRANSACTION,
00057 ER(ER_LOCK_OR_ACTIVE_TRANSACTION),
00058 MYF(0));
00059 return true;
00060 }
00061
00062 bool res = true;
00063 std::string path;
00064 schema_identifier.getSQLPath(path);
00065 if (unlikely(plugin::EventObserver::beforeDropDatabase(session(), path)))
00066 {
00067 my_error(ER_EVENT_OBSERVER_PLUGIN, schema_identifier);
00068 }
00069 else
00070 {
00071 res= schema::drop(session(), schema_identifier, drop_if_exists);
00072 if (unlikely(plugin::EventObserver::afterDropDatabase(session(), path, res)))
00073 {
00074 my_error(ER_EVENT_OBSERVER_PLUGIN, MYF(0), path.c_str());
00075 res = false;
00076 }
00077
00078 }
00079
00080 return res;
00081 }
00082
00083 }
00084