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