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 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00049 try
00050 {
00051 if (not user_locks::Locks::getInstance().lock(getSession().getSessionId(), list_of_locks))
00052 return 0;
00053 }
00054 catch (boost::thread_interrupted const&)
00055 {
00056 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00057 null_value= true;
00058 return 0;
00059 }
00060 }
00061
00062 user_locks::Storable *list= getSession().getProperty<user_locks::Storable>("user_locks");
00063 if (not list)
00064 list= getSession().setProperty("user_locks", new user_locks::Storable(getSession().getSessionId()));
00065 BOOST_FOREACH(Keys::const_reference iter, list_of_locks)
00066 list->insert(iter);
00067 null_value= false;
00068 return 1;
00069 }
00070
00071 }