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/lock_storage.h>
00024
00025 #include <string>
00026
00027 namespace user_locks {
00028 namespace locks {
00029
00030 int64_t ReleaseAndWait::val_int()
00031 {
00032 drizzled::String *res= args[0]->val_str(&value);
00033
00034 if (not res || not res->length())
00035 {
00036 my_error(drizzled::ER_USER_LOCKS_INVALID_NAME_LOCK, MYF(0));
00037 return 0;
00038 }
00039 null_value= false;
00040
00041 drizzled::identifier::User::const_shared_ptr user_identifier(getSession().user());
00042 drizzled::session_id_t id= getSession().getSessionId();
00043 locks::return_t result;
00044
00045 {
00046 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00047 try {
00048 result= user_locks::Locks::getInstance().release(Key(*user_identifier, res->c_str()), id, true);
00049 }
00050 catch(boost::thread_interrupted const& error)
00051 {
00052 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00053 return 0;
00054 }
00055 }
00056
00057 switch (result)
00058 {
00059 default:
00060 case locks::SUCCESS:
00061 {
00062 user_locks::Storable *list= static_cast<user_locks::Storable *>(getSession().getProperty("user_locks"));
00063 assert(list);
00064 if (list)
00065 list->erase(Key(*user_identifier, res->c_str()));
00066 return 1;
00067 }
00068 case locks::NOT_FOUND:
00069 null_value= true;
00070 return 0;
00071 case locks::NOT_OWNED_BY:
00072 my_error(drizzled::ER_USER_LOCKS_NOT_OWNER_OF_LOCK, MYF(0));
00073 return 0;
00074 }
00075 }
00076
00077 }
00078 }