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= static_cast<user_locks::Storable *>(getSession().getProperty("user_locks"));
00047 if (list)
00048 list->erase_all();
00049
00050 bool result;
00051 drizzled::identifier::User::const_shared_ptr user_identifier(getSession().user());
00052 {
00053 boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
00054
00055 try {
00056 result= user_locks::Locks::getInstance().lock(getSession().getSessionId(), Key(*user_identifier, res->c_str()), wait_time);
00057 }
00058 catch(boost::thread_interrupted const& error)
00059 {
00060 my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
00061 null_value= true;
00062
00063 return 0;
00064 }
00065 }
00066
00067 if (result)
00068 {
00069 if (not list)
00070 {
00071 list= new user_locks::Storable(getSession().getSessionId());
00072 getSession().setProperty("user_locks", list);
00073 }
00074
00075 list->insert(Key(*user_identifier, res->c_str()));
00076
00077 return 1;
00078 }
00079
00080 return 0;
00081 }
00082
00083 }