1#ifndef VERS_UTILS_INCLUDED
2#define VERS_UTILS_INCLUDED
3
4#include "table.h"
5#include "sql_class.h"
6#include "vers_string.h"
7
8class MDL_auto_lock
9{
10 THD *thd;
11 TABLE_LIST &table;
12 bool error;
13
14public:
15 MDL_auto_lock(THD *_thd, TABLE_LIST &_table) :
16 thd(_thd), table(_table)
17 {
18 DBUG_ASSERT(thd);
19 MDL_request protection_request;
20 if (thd->global_read_lock.can_acquire_protection())
21 {
22 error= true;
23 return;
24 }
25 protection_request.init(MDL_key::GLOBAL, "", "", MDL_INTENTION_EXCLUSIVE,
26 MDL_EXPLICIT);
27 error= thd->mdl_context.acquire_lock(&protection_request, thd->variables.lock_wait_timeout);
28 if (error)
29 return;
30
31 table.mdl_request.init(MDL_key::TABLE, table.db.str, table.table_name.str, MDL_EXCLUSIVE, MDL_EXPLICIT);
32 error= thd->mdl_context.acquire_lock(&table.mdl_request, thd->variables.lock_wait_timeout);
33 thd->mdl_context.release_lock(protection_request.ticket);
34 }
35 ~MDL_auto_lock()
36 {
37 if (!error)
38 {
39 DBUG_ASSERT(table.mdl_request.ticket);
40 thd->mdl_context.release_lock(table.mdl_request.ticket);
41 table.mdl_request.ticket= NULL;
42 }
43 }
44 bool acquire_error() const { return error; }
45};
46
47#endif // VERS_UTILS_INCLUDED
48