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 GetLock::val_int()
00030 {
00031 drizzled::String *res= args[0]->val_str(&value);
00032 int64_t wait_time= 0;
00033
00034 if (arg_count == 2)
00035 {
00036 wait_time= args[1]->val_int();
00037 }
00038
00039 if (not res || not res->length())
00040 {
00041 my_error(drizzled::ER_USER_LOCKS_INVALID_NAME_LOCK, MYF(0));
00042 return 0;
00043 }
00044 null_value= false;
00045
00046 user_locks::Storable *list= getSession().getProperty<user_locks::Storable>("user_locks");
00047 if (list)
00048 list->erase_all();
00049
00050 drizzled::identifier::user::ptr user_identifier(getSession().user());
00051 {
00052 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00053
00054 try
00055 {
00056 if (not user_locks::Locks::getInstance().lock(getSession().getSessionId(), Key(*user_identifier, res->c_str()), wait_time))
00057 return 0;
00058 }
00059 catch (boost::thread_interrupted const&)
00060 {
00061 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00062 null_value= true;
00063 return 0;
00064 }
00065 }
00066 if (not list)
00067 list= getSession().setProperty("user_locks", new user_locks::Storable(getSession().getSessionId()));
00068 list->insert(Key(*user_identifier, res->c_str()));
00069 return 1;
00070 }
00071
00072 }