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 Release::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_BARRIER, MYF(0));
00037 null_value= true;
00038 return 0;
00039 }
00040
00041
00042 drizzled::identifier::User::const_shared_ptr user_identifier(getSession().user());
00043
00044 barriers::return_t result= Barriers::getInstance().release(Key(*user_identifier, res->c_str()), getSession().getSessionId());
00045
00046 switch (result)
00047 {
00048 default:
00049 case barriers::SUCCESS:
00050 {
00051 Storable *list= static_cast<Storable *>(getSession().getProperty(property_key));
00052 assert(list);
00053 if (not list)
00054 {
00055 my_error(drizzled::ER_USER_LOCKS_NOT_OWNER_OF_BARRIER, MYF(0));
00056 null_value= true;
00057
00058 return 0;
00059 }
00060 list->erase(Key(*user_identifier, res->c_str()));
00061 null_value= false;
00062
00063 return 1;
00064 }
00065 case barriers::NOT_FOUND:
00066 my_error(drizzled::ER_USER_LOCKS_UNKNOWN_BARRIER, MYF(0));
00067 null_value= true;
00068 return 0;
00069 case barriers::NOT_OWNED_BY:
00070 my_error(drizzled::ER_USER_LOCKS_NOT_OWNER_OF_BARRIER, MYF(0));
00071 null_value= true;
00072 return 0;
00073 }
00074 }
00075
00076 }
00077 }