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 GetLocks::val_int()
00030 {
00031 Keys list_of_locks;
00032
00033 for (int64_t x= 0; x < arg_count; x++)
00034 {
00035 drizzled::String *res= args[x]->val_str(&value);
00036
00037 if (res && res->length())
00038 {
00039 list_of_locks.insert(Key(*getSession().user(), res->c_str()));
00040 }
00041 else
00042 {
00043 my_error(drizzled::ER_USER_LOCKS_INVALID_NAME_LOCK, MYF(0));
00044 return 0;
00045 }
00046 }
00047
00048 bool result;
00049 {
00050 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00051
00052 try {
00053 result= user_locks::Locks::getInstance().lock(getSession().getSessionId(), list_of_locks);
00054 }
00055 catch(boost::thread_interrupted const& error)
00056 {
00057 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00058 null_value= true;
00059
00060 return 0;
00061 }
00062 }
00063
00064 if (result)
00065 {
00066 user_locks::Storable *list= static_cast<user_locks::Storable *>(getSession().getProperty("user_locks"));
00067 if (not list)
00068 {
00069 list= new user_locks::Storable(getSession().getSessionId());
00070 getSession().setProperty("user_locks", list);
00071 }
00072
00073 for (Keys::iterator iter= list_of_locks.begin();
00074 iter != list_of_locks.end(); iter++)
00075 {
00076 list->insert(*iter);
00077 }
00078
00079 null_value= false;
00080
00081 return 1;
00082 }
00083
00084 return 0;
00085 }
00086
00087 }