plugin/pfs_table_plugin/pfs_example_employee_name.h (136 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, 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ #ifndef PLUGIN_PFS_TABLE_PLUGIN_pfs_example_employee_name_H_ #define PLUGIN_PFS_TABLE_PLUGIN_pfs_example_employee_name_H_ #include <mysql/plugin.h> #include <mysql/components/service_implementation.h> #include <mysql/components/services/pfs_plugin_table_service.h> /* Service handle */ extern SERVICE_TYPE(pfs_plugin_table) * table_svc; /* Global share pointer for pfs_example_employee_name table */ extern PFS_engine_table_share_proxy ename_st_share; /* Maximum number of rows in the table */ #define EMPLOYEEE_NAME_MAX_ROWS 100 /* A mutex instance to protect: * - ename_rows_in_table * - ename_next_available_index * - ename_records_array */ extern mysql_mutex_t LOCK_ename_records_array; /* A structure to denote a single row of the table. */ struct { public: PSI_int e_number; char f_name[20]; unsigned int f_name_length; char l_name[20]; unsigned int l_name_length; /* If there is a value in this row */ bool m_exist; } typedef Ename_Record; /** * An array to keep rows of the tables. * When a row is inserted in plugin table, it will be stored here. * When a row is queried from plugin table, it will be fetched from here. */ extern Ename_Record ename_records_array[EMPLOYEEE_NAME_MAX_ROWS]; /* A class to define position of cursor in table. */ class Ename_POS { private: unsigned int m_index; public: ~Ename_POS(){}; Ename_POS() { m_index = 0; } bool has_more() { if (m_index < EMPLOYEEE_NAME_MAX_ROWS) return true; return false; } void next() { m_index++; } void reset() { m_index = 0; } unsigned int get_index() { return m_index; } void set_at(unsigned int index) { m_index = index; } void set_at(Ename_POS *pos) { m_index = pos->m_index; } void set_after(Ename_POS *pos) { m_index = pos->m_index + 1; } }; class Ename_index { public: virtual ~Ename_index(){}; virtual bool match(Ename_Record *record) = 0; }; /* And index on Employee Number */ class Ename_index_by_emp_num : public Ename_index { public: PSI_plugin_key_integer m_emp_num; bool match(Ename_Record *record) { return table_svc->match_key_integer(false, record->e_number.val, &m_emp_num); } }; /* An index on Employee First Name */ class Ename_index_by_emp_fname : public Ename_index { public: PSI_plugin_key_string m_emp_fname; char m_emp_fname_buffer[20]; bool match(Ename_Record *record) { return table_svc->match_key_string( false, record->f_name, record->f_name_length, &m_emp_fname); } }; /* A structure to define a handle for table in plugin/component code. */ typedef struct { /* Current position instance */ Ename_POS m_pos; /* Next position instance */ Ename_POS m_next_pos; /* Current row for the table */ Ename_Record current_row; /* Index on table */ Ename_index_by_emp_num m_emp_num_index; Ename_index_by_emp_fname m_emp_fname_index; /* Index indicator */ unsigned int index_num; } Ename_Table_Handle; PSI_table_handle *ename_open_table(PSI_pos **pos); void ename_close_table(PSI_table_handle *handle); int ename_rnd_next(PSI_table_handle *handle); int ename_rnd_init(PSI_table_handle *h, bool scan); int ename_rnd_pos(PSI_table_handle *handle); int ename_index_init(PSI_table_handle *handle, uint idx, bool sorted, PSI_index_handle **index); int ename_index_read(PSI_index_handle *index, PSI_key_reader *reader, unsigned int idx, int find_flag); int ename_index_next(PSI_table_handle *handle); void ename_reset_position(PSI_table_handle *handle); int ename_read_column_value(PSI_table_handle *handle, PSI_field *field, uint index); int ename_write_row_values(PSI_table_handle *handle); int ename_write_column_value(PSI_table_handle *handle, PSI_field *field, unsigned int index); int ename_update_row_values(PSI_table_handle *handle); int ename_update_column_value(PSI_table_handle *handle, PSI_field *field, unsigned int index); int ename_delete_row_values(PSI_table_handle *handle); int ename_delete_all_rows(void); unsigned long long ename_get_row_count(void); void init_ename_share(PFS_engine_table_share_proxy *share); #endif /* PLUGIN_PFS_TABLE_PLUGIN_pfs_example_employee_name_H_ */