23 #include <drizzled/session.h>
24 #include <drizzled/user_var_entry.h>
25 #include <drizzled/plugin/client/cached.h>
26 #include <drizzled/plugin/client/concurrent.h>
27 #include <drizzled/catalog/local.h>
28 #include <drizzled/execute.h>
32 Execute::Execute(Session &arg,
bool wait_arg) :
38 void Execute::run(
str_ref execution_string, sql::ResultSet &result_set)
40 if (not _session.isConcurrentExecuteAllowed())
42 my_error(ER_WRONG_ARGUMENTS, MYF(0),
"A Concurrent Execution Session can not launch another session.");
47 plugin::client::Cached *client=
new plugin::client::Cached(result_set);
48 client->pushSQL(execution_string);
49 Session::shared_ptr new_session= Session::make_shared(client, catalog::local());
52 util::string::ptr schema(_session.schema());
53 if (not schema->empty())
54 new_session->set_schema(*schema);
56 new_session->setConcurrentExecute(
false);
61 new_session->user()= _session.user();
62 new_session->setOriginatingServerUUID(_session.getOriginatingServerUUID());
63 new_session->setOriginatingCommitID(_session.getOriginatingCommitID());
65 if (Session::schedule(new_session))
67 Session::unlink(new_session);
71 thread= new_session->getThread();
75 if (wait && thread && thread->joinable())
78 if (_session.getThread())
80 boost::this_thread::restore_interruption dl(_session.getThreadInterupt());
86 catch(boost::thread_interrupted
const&)
89 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
100 void Execute::run(
str_ref execution_string)
102 if (not _session.isConcurrentExecuteAllowed())
104 my_error(ER_WRONG_ARGUMENTS, MYF(0),
"A Concurrent Execution Session can not launch another session.");
109 plugin::client::Concurrent *client=
new plugin::client::Concurrent;
110 client->pushSQL(execution_string);
111 Session::shared_ptr new_session= Session::make_shared(client, catalog::local());
114 util::string::ptr schema(_session.schema());
115 if (not schema->empty())
116 new_session->set_schema(*schema);
118 new_session->setConcurrentExecute(
false);
123 new_session->user()= _session.user();
125 if (Session::schedule(new_session))
127 Session::unlink(new_session);
131 thread= new_session->getThread();
135 if (wait && thread && thread->joinable())
138 if (_session.getThread())
140 boost::this_thread::restore_interruption dl(_session.getThreadInterupt());
146 catch(boost::thread_interrupted
const&)
149 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));