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 #include <plugin/user_locks/module.h>
00023 #include <plugin/user_locks/barrier_storage.h>
00024
00025 #include <string>
00026
00027 namespace user_locks {
00028 namespace barriers {
00029
00030 int64_t Wait::val_int()
00031 {
00032 drizzled::String *res= args[0]->val_str(&value);
00033
00034 if (res and res->length())
00035 {
00036 Barrier::shared_ptr barrier= Barriers::getInstance().find(Key(*getSession().user(), res->c_str()));
00037
00038 if (barrier and barrier->getOwner() == getSession().getSessionId())
00039 {
00040 my_error(drizzled::ER_USER_LOCKS_CANT_WAIT_ON_OWN_BARRIER, MYF(0));
00041
00042 return 0;
00043 }
00044 else if (barrier)
00045 {
00046 if (arg_count == 2)
00047 {
00048 int64_t generation;
00049 generation= args[1]->val_int();
00050 barrier->wait(generation);
00051 }
00052 else
00053 {
00054 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00055
00056 try {
00057 barrier->wait();
00058 }
00059 catch(boost::thread_interrupted const&)
00060 {
00061
00062 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00063 return 0;
00064 }
00065 }
00066 null_value= false;
00067
00068 return 1;
00069 }
00070 }
00071 else if (not res || not res->length())
00072 {
00073 my_error(drizzled::ER_USER_LOCKS_INVALID_NAME_BARRIER, MYF(0));
00074 return 0;
00075 }
00076
00077 my_error(drizzled::ER_USER_LOCKS_UNKNOWN_BARRIER, MYF(0));
00078
00079 return 0;
00080 }
00081
00082 }
00083 }