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 WaitUntil::val_int()
00031 {
00032 drizzled::String *res= args[0]->val_str(&value);
00033 int64_t wait_until= args[1]->val_int();
00034
00035 if (res and res->length() and wait_until)
00036 {
00037 Barrier::shared_ptr barrier= Barriers::getInstance().find(Key(*getSession().user(), res->c_str()));
00038
00039 if (barrier and barrier->getOwner() == getSession().getSessionId())
00040 {
00041 my_error(drizzled::ER_USER_LOCKS_CANT_WAIT_ON_OWN_BARRIER, MYF(0));
00042
00043 return 0;
00044 }
00045 else if (barrier)
00046 {
00047 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00048 try {
00049 barrier->wait_until(wait_until);
00050 }
00051 catch(boost::thread_interrupted const&)
00052 {
00053
00054 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00055 return 0;
00056 }
00057
00058 null_value= false;
00059
00060 return 1;
00061 }
00062 }
00063 else if (not res || not res->length())
00064 {
00065 my_error(drizzled::ER_USER_LOCKS_INVALID_NAME_BARRIER, MYF(0));
00066 return 0;
00067 }
00068
00069 my_error(drizzled::ER_USER_LOCKS_UNKNOWN_BARRIER, MYF(0));
00070 null_value= false;
00071
00072 return 0;
00073 }
00074
00075 }
00076 }