summaryrefslogtreecommitdiff
path: root/storage/perfschema/table_setup_actors.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/perfschema/table_setup_actors.cc')
-rw-r--r--storage/perfschema/table_setup_actors.cc91
1 files changed, 69 insertions, 22 deletions
diff --git a/storage/perfschema/table_setup_actors.cc b/storage/perfschema/table_setup_actors.cc
index 007081a83c9..5004dbc7c16 100644
--- a/storage/perfschema/table_setup_actors.cc
+++ b/storage/perfschema/table_setup_actors.cc
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+/* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
@@ -26,13 +26,15 @@
*/
#include "my_global.h"
-#include "my_pthread.h"
+#include "my_thread.h"
#include "pfs_instr_class.h"
#include "pfs_column_types.h"
#include "pfs_column_values.h"
#include "pfs_setup_actor.h"
#include "table_setup_actors.h"
#include "pfs_global.h"
+#include "pfs_buffer_container.h"
+#include "field.h"
THR_LOCK table_setup_actors::m_table_lock;
@@ -45,13 +47,15 @@ table_setup_actors::m_share=
table_setup_actors::write_row,
table_setup_actors::delete_all_rows,
table_setup_actors::get_row_count,
- 1000, /* records */
sizeof(PFS_simple_index),
&m_table_lock,
{ C_STRING_WITH_LEN("CREATE TABLE setup_actors("
"HOST CHAR(60) collate utf8_bin default '%' not null,"
- "USER CHAR(16) collate utf8_bin default '%' not null,"
- "ROLE CHAR(16) collate utf8_bin default '%' not null)") }
+ "USER CHAR(" USERNAME_CHAR_LENGTH_STR ") collate utf8_bin default '%' not null,"
+ "ROLE CHAR(16) collate utf8_bin default '%' not null,"
+ "ENABLED ENUM('YES', 'NO') not null,"
+ "HISTORY ENUM('YES', 'NO') not null)") },
+ false /* perpetual */
};
PFS_engine_table* table_setup_actors::create()
@@ -69,6 +73,10 @@ int table_setup_actors::write_row(TABLE *table, const unsigned char *buf,
String *user= &user_data;
String *host= &host_data;
String *role= &role_data;
+ enum_yes_no enabled_value= ENUM_YES;
+ enum_yes_no history_value= ENUM_YES;
+ bool enabled;
+ bool history;
for (; (f= *fields) ; fields++)
{
@@ -85,16 +93,34 @@ int table_setup_actors::write_row(TABLE *table, const unsigned char *buf,
case 2: /* ROLE */
role= get_field_char_utf8(f, &role_data);
break;
+ case 3: /* ENABLED */
+ enabled_value= (enum_yes_no) get_field_enum(f);
+ break;
+ case 4: /* HISTORY */
+ history_value= (enum_yes_no) get_field_enum(f);
+ break;
default:
DBUG_ASSERT(false);
}
}
}
+ /* Reject illegal enum values in ENABLED */
+ if ((enabled_value != ENUM_YES) && (enabled_value != ENUM_NO))
+ return HA_ERR_NO_REFERENCED_ROW;
+
+ /* Reject illegal enum values in HISTORY */
+ if ((history_value != ENUM_YES) && (history_value != ENUM_NO))
+ return HA_ERR_NO_REFERENCED_ROW;
+
+ /* Reject if any of user/host/role is not provided */
if (user->length() == 0 || host->length() == 0 || role->length() == 0)
return HA_ERR_WRONG_COMMAND;
- return insert_setup_actor(user, host, role);
+ enabled= (enabled_value == ENUM_YES) ? true : false;
+ history= (history_value == ENUM_YES) ? true : false;
+
+ return insert_setup_actor(user, host, role, enabled, history);
}
int table_setup_actors::delete_all_rows(void)
@@ -104,7 +130,7 @@ int table_setup_actors::delete_all_rows(void)
ha_rows table_setup_actors::get_row_count(void)
{
- return setup_actor_count();
+ return global_setup_actor_container.get_row_count();
}
table_setup_actors::table_setup_actors()
@@ -122,17 +148,14 @@ int table_setup_actors::rnd_next()
{
PFS_setup_actor *pfs;
- for (m_pos.set_at(&m_next_pos);
- m_pos.m_index < setup_actor_max;
- m_pos.next())
+ m_pos.set_at(&m_next_pos);
+ PFS_setup_actor_iterator it= global_setup_actor_container.iterate(m_pos.m_index);
+ pfs= it.scan_next(& m_pos.m_index);
+ if (pfs != NULL)
{
- pfs= &setup_actor_array[m_pos.m_index];
- if (pfs->m_lock.is_populated())
- {
- make_row(pfs);
- m_next_pos.set_after(&m_pos);
- return 0;
- }
+ make_row(pfs);
+ m_next_pos.set_after(&m_pos);
+ return 0;
}
return HA_ERR_END_OF_FILE;
@@ -144,9 +167,8 @@ int table_setup_actors::rnd_pos(const void *pos)
set_position(pos);
- DBUG_ASSERT(m_pos.m_index < setup_actor_max);
- pfs= &setup_actor_array[m_pos.m_index];
- if (pfs->m_lock.is_populated())
+ pfs= global_setup_actor_container.get(m_pos.m_index);
+ if (pfs != NULL)
{
make_row(pfs);
return 0;
@@ -157,7 +179,7 @@ int table_setup_actors::rnd_pos(const void *pos)
void table_setup_actors::make_row(PFS_setup_actor *pfs)
{
- pfs_lock lock;
+ pfs_optimistic_state lock;
m_row_exists= false;
@@ -181,6 +203,9 @@ void table_setup_actors::make_row(PFS_setup_actor *pfs)
return;
memcpy(m_row.m_rolename, pfs->m_rolename, m_row.m_rolename_length);
+ m_row.m_enabled_ptr= &pfs->m_enabled;
+ m_row.m_history_ptr= &pfs->m_history;
+
if (pfs->m_lock.end_optimistic_lock(&lock))
m_row_exists= true;
}
@@ -213,6 +238,12 @@ int table_setup_actors::read_row_values(TABLE *table,
case 2: /* ROLE */
set_field_char_utf8(f, m_row.m_rolename, m_row.m_rolename_length);
break;
+ case 3: /* ENABLED */
+ set_field_enum(f, (*m_row.m_enabled_ptr) ? ENUM_YES : ENUM_NO);
+ break;
+ case 4: /* HISTORY */
+ set_field_enum(f, (*m_row.m_history_ptr) ? ENUM_YES : ENUM_NO);
+ break;
default:
DBUG_ASSERT(false);
}
@@ -227,7 +258,9 @@ int table_setup_actors::update_row_values(TABLE *table,
const unsigned char *new_buf,
Field **fields)
{
+ int result;
Field *f;
+ enum_yes_no value;
for (; (f= *fields) ; fields++)
{
@@ -239,6 +272,19 @@ int table_setup_actors::update_row_values(TABLE *table,
case 1: /* USER */
case 2: /* ROLE */
return HA_ERR_WRONG_COMMAND;
+ case 3: /* ENABLED */
+ value= (enum_yes_no) get_field_enum(f);
+ /* Reject illegal enum values in ENABLED */
+ if ((value != ENUM_YES) && (value != ENUM_NO))
+ return HA_ERR_NO_REFERENCED_ROW;
+ *m_row.m_enabled_ptr= (value == ENUM_YES) ? true : false;
+ break;
+ case 4: /* HISTORY */
+ value= (enum_yes_no) get_field_enum(f);
+ /* Reject illegal enum values in HISTORY */
+ if ((value != ENUM_YES) && (value != ENUM_NO))
+ return HA_ERR_NO_REFERENCED_ROW;
+ *m_row.m_history_ptr= (value == ENUM_YES) ? true : false;
break;
default:
DBUG_ASSERT(false);
@@ -246,7 +292,8 @@ int table_setup_actors::update_row_values(TABLE *table,
}
}
- return 0;
+ result= update_setup_actors_derived_flags();
+ return result;
}
int table_setup_actors::delete_row_values(TABLE *table,