diff options
Diffstat (limited to 'storage/perfschema/table_setup_actors.cc')
-rw-r--r-- | storage/perfschema/table_setup_actors.cc | 91 |
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, |