storage/perfschema/table_plugin_table.cc (134 lines of code) (raw):
/* Copyright (c) 2017, 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 as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
/**
@file storage/perfschema/table_plugin_table.cc
plugins/components tables (implementation).
*/
#include "table_plugin_table.h"
#include "pfs_plugin_table.h"
int
PFS_plugin_table_index::init(PSI_table_handle *plugin_table,
uint idx,
bool sorted)
{
int ret;
m_idx = idx;
/* call the plugin to initialize the index. */
ret = m_st_table->index_init(plugin_table, idx, sorted, &m_plugin_index);
return ret;
}
void
PFS_plugin_table_index::read_key(const uchar *key,
uint key_len,
enum ha_rkey_function find_flag)
{
PFS_key_reader reader(m_key_info, key, key_len);
m_st_table->index_read(
m_plugin_index, (PSI_key_reader *)&reader, m_idx, find_flag);
}
int
PFS_plugin_table_index::index_next(PSI_table_handle *table)
{
return m_st_table->index_next(table);
}
PFS_engine_table *
table_plugin_table::create(PFS_engine_table_share *share)
{
return new table_plugin_table((PFS_engine_table_share *)share);
}
table_plugin_table::table_plugin_table(PFS_engine_table_share *share)
: PFS_engine_table(share, NULL),
m_share(share),
m_table_lock(share->m_thr_lock_ptr)
{
this->m_st_table = &share->m_st_table;
this->plugin_table_handle = m_st_table->open_table(&m_pos);
/* Setup the base class position pointer */
m_pos_ptr = m_pos;
}
void
table_plugin_table::reset_position(void)
{
m_st_table->reset_position(this->plugin_table_handle);
}
int
table_plugin_table::rnd_init(bool scan)
{
return m_st_table->rnd_init(this->plugin_table_handle, scan);
}
int
table_plugin_table::rnd_next(void)
{
return m_st_table->rnd_next(this->plugin_table_handle);
}
int
table_plugin_table::rnd_pos(const void *pos)
{
set_position(pos);
return m_st_table->rnd_pos(this->plugin_table_handle);
}
int
table_plugin_table::index_init(uint idx, bool sorted)
{
int ret = 0;
PFS_plugin_table_index *result = NULL;
/* Create an index instance for plugin table */
result = new PFS_plugin_table_index(m_st_table);
ret = result->init(plugin_table_handle, idx, sorted);
m_opened_index = result;
m_index = result;
return ret;
}
int
table_plugin_table::index_next(void)
{
return m_opened_index->index_next(this->plugin_table_handle);
}
int
table_plugin_table::read_row_values(TABLE *table,
unsigned char *buf,
Field **fields,
bool read_all)
{
Field *f;
int result = 0;
/* Set the buf using null_bytes */
for (uint temp_null_bytes = table->s->null_bytes; temp_null_bytes > 0;
temp_null_bytes--)
buf[temp_null_bytes - 1] = 0;
for (; (f = *fields); fields++)
{
if (read_all || bitmap_is_set(table->read_set, f->field_index))
{
result = m_st_table->read_column_value(
this->plugin_table_handle, (PSI_field *)f, f->field_index);
if (result)
return result;
}
}
return result;
}
int
table_plugin_table::delete_all_rows(void)
{
return m_share->m_delete_all_rows();
}
int
table_plugin_table::update_row_values(TABLE *table,
const unsigned char *,
unsigned char *,
Field **fields)
{
Field *f;
int result = 0;
for (; (f = *fields); fields++)
{
if (bitmap_is_set(table->write_set, f->field_index))
{
result = m_st_table->update_column_value(
plugin_table_handle, (PSI_field *)f, f->field_index);
if (result)
{
return result;
}
}
}
/* After the columns values are updated, update the row */
return m_st_table->update_row_values(plugin_table_handle);
}
int
table_plugin_table::delete_row_values(TABLE *,
const unsigned char *,
Field **)
{
return m_st_table->delete_row_values(plugin_table_handle);
}