~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/statement/execute.cc

  • Committer: Brian Aker
  • Date: 2010-11-28 08:56:23 UTC
  • mfrom: (1958.1.2 catalogs)
  • Revision ID: brian@tangent.org-20101128085623-dray43djzamqs3n2
Merge in WAIT

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
Execute::Execute(Session *in_session,
40
40
                 drizzled::execute_string_t to_execute_arg,
41
41
                 bool is_quiet_arg,
42
 
                 bool is_concurrent_arg) :
 
42
                 bool is_concurrent_arg,
 
43
                 bool should_wait_arg) :
43
44
  Statement(in_session),
44
45
  is_quiet(is_quiet_arg),
45
46
  is_concurrent(is_concurrent_arg),
 
47
  should_wait(should_wait_arg),
46
48
  to_execute(to_execute_arg)
47
49
{
48
50
}
84
86
 
85
87
bool statement::Execute::execute()
86
88
{
 
89
  bool ret= execute_shell();
 
90
 
 
91
  // We have to restore ourselves at the top for delete() to work.
 
92
  getSession()->getLex()->statement= this;
 
93
 
 
94
  return ret;
 
95
}
 
96
 
 
97
 
 
98
bool statement::Execute::execute_shell()
 
99
{
87
100
  if (to_execute.length == 0)
88
101
  {
89
102
    my_error(ER_WRONG_ARGUMENTS, MYF(0), "Invalid Variable");
90
103
    return false;
91
104
  }
 
105
 
92
106
  if (to_execute.isVariable())
93
107
  {
94
108
    if (not parseVariable())
100
114
 
101
115
  if (is_concurrent)
102
116
  {
 
117
    boost_thread_shared_ptr thread;
 
118
 
103
119
    if (getSession()->isConcurrentExecuteAllowed())
104
120
    {
105
121
      plugin::client::Concurrent *client= new plugin::client::Concurrent;
119
135
      new_session->getSecurityContext()= getSession()->getSecurityContext();
120
136
 
121
137
      if (Session::schedule(new_session))
 
138
      {
122
139
        Session::unlink(new_session);
 
140
      }
 
141
      else if (should_wait)
 
142
      {
 
143
        thread= new_session->getThread();
 
144
      }
123
145
    }
124
146
    else
125
147
    {
126
148
      my_error(ER_WRONG_ARGUMENTS, MYF(0), "A Concurrent Execution Session can not launch another session.");
127
149
      return false;
128
150
    }
 
151
 
 
152
    if (should_wait && thread && thread->joinable())
 
153
    {
 
154
      // We want to make sure that we can be killed
 
155
      boost::this_thread::restore_interruption dl(getSession()->getThreadInterupt());
 
156
      try {
 
157
        thread->join();
 
158
      }
 
159
      catch(boost::thread_interrupted const&)
 
160
      {
 
161
        // Just surpress and return the error
 
162
        my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
 
163
 
 
164
        return false;
 
165
      }
 
166
    }
129
167
  }
130
168
  else 
131
169
  {
226
264
    }
227
265
  }
228
266
 
229
 
 
230
 
  // We have to restore ourselves at the top for delete() to work.
231
 
  getSession()->getLex()->statement= this;
232
 
 
233
267
  return true;
234
268
}
235
269