components/pfs_component/pfs_example_component_population.cc (157 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 */ #include <cstring> #include "pfs_example_component_population.h" #include "pfs_example_continent.h" #include "pfs_example_country.h" #include "my_sys.h" /** @page EXAMPLE_COMPONENT An example component Component Name : pfs_example_component_population \n Source location : components/pfs_component This file contains a definition of the pfs_example_component_population. */ /* clang-format off */ /* Records to be inserted into pfs_example_continent table from component code */ Continent_record continent_array[] = { {"bar1", 4, true}, {"bar2", 4, true} }; /* Records to be inserted into pfs_example_country table from component code */ Country_record country_array[] = { {"foo1", 4, "bar1", 4, {2016, false}, {10000, false}, {1.11, false}, true}, {"foo2", 4, "bar2", 4, {2016, false}, {1000, false}, {2.22, false}, true} }; /* clang-format on */ #define MAX_BUFFER_LENGTH 80 #define WRITE_LOG(lit_log_text) \ if (outfile) \ { \ strcpy (log_text, lit_log_text); \ fwrite((uchar*)log_text, sizeof(char), strlen(log_text), outfile); \ } /* Log file */ FILE *outfile = NULL; const char *filename= "pfs_example_component_population.log"; char log_text[MAX_BUFFER_LENGTH] = {'\0'}; /* Collection of table shares to be added to performance schema */ PFS_engine_table_share_proxy *share_list[2] = {NULL, NULL}; unsigned int share_list_count = 2; /* Prepare and insert rows in pfs_example_continent table */ int continent_prepare_insert_row() { int result = 0; Continent_Table_Handle handle; int array_size = sizeof(continent_array) / sizeof(continent_array[0]); for (int i = 0; i < array_size; i++) { /* Prepare a sample row to be inserted from here */ strncpy(handle.current_row.name, continent_array[i].name, continent_array[i].name_length); handle.current_row.name_length = continent_array[i].name_length; handle.current_row.m_exist = continent_array[i].m_exist; /* Insert a row in the table to be added */ result = write_rows_from_component(&handle); if (result) break; } return result; } /* Prepare and insert rows in pfs_example_country table */ int country_prepare_insert_row() { int result = 0; Country_Table_Handle handle; int array_size = sizeof(country_array) / sizeof(country_array[0]); for (int i = 0; i < array_size; i++) { /* Prepare a sample row to be inserted from here */ strncpy(handle.current_row.name, country_array[i].name, country_array[i].name_length); handle.current_row.name_length = country_array[i].name_length; strncpy(handle.current_row.continent_name, country_array[i].continent_name, country_array[i].continent_name_length); handle.current_row.continent_name_length = country_array[i].continent_name_length; handle.current_row.year = country_array[i].year; handle.current_row.population = country_array[i].population; handle.current_row.growth_factor = country_array[i].growth_factor; handle.current_row.m_exist = country_array[i].m_exist; /* Insert a row in the table to be added */ result = country_write_row_values((PSI_table_handle *)&handle); if (result) break; } return result; } /** * Initialize the pfs_example_component_population at server start or * component installation. * * - Instantiate and initialize PFS_engine_table_share_proxy. * - Prepare and insert rows in tables from here. * - Call add_table method of pfs_plugin_table service. * * @retval 0 success * @retval non-zero failure */ mysql_service_status_t pfs_example_component_population_init() { mysql_service_status_t result = 0; /* If fopen fails, outfile will be NULL so there will be no write in WRITE_LOG */ outfile= fopen(filename, "w+"); WRITE_LOG("pfs_example_component_population init:\n"); /* Initialize mutex */ native_mutex_init(&LOCK_continent_records_array, NULL); native_mutex_init(&LOCK_country_records_array, NULL); /* Instantiate and initialize PFS_engine_table_share_proxy */ init_continent_share(&continent_st_share); init_country_share(&country_st_share); /* From here, prepare rows for tables and insert */ if (continent_prepare_insert_row() || country_prepare_insert_row()) { WRITE_LOG("Error returned from prepare_insert_row()\n"); result = true; goto error; } /* Prepare the shares list to be passed to the service call */ share_list[0] = &continent_st_share; share_list[1] = &country_st_share; /** * Call add_table function of pfs_plugin_table service to * add component tables in performance schema. */ if (mysql_service_pfs_plugin_table->add_tables(&share_list[0], share_list_count)) { WRITE_LOG("Error returned from add_tables()\n"); result = true; goto error; } else { WRITE_LOG ("Passed add_tables()\n"); } error: WRITE_LOG ("End of init\n\n"); fclose(outfile); if (result) { /* Destroy mutexes */ native_mutex_destroy(&LOCK_continent_records_array); native_mutex_destroy(&LOCK_country_records_array); } return result; } /** * Terminate the pfs_example_component_population at server shutdown or * component deinstallation. * * - Delete/Drop component tables from Performance Schema. * * @retval 0 success * @retval non-zero failure */ mysql_service_status_t pfs_example_component_population_deinit() { mysql_service_status_t result = 0; /* If fopen fails, outfile will be NULL so there will be no write in WRITE_LOG */ outfile= fopen(filename, "a+"); WRITE_LOG("pfs_example_component_population_deinit:\n"); /** * Call delete_tables function of pfs_plugin_table service to * delete component tables from performance schema */ if (mysql_service_pfs_plugin_table->delete_tables(&share_list[0], share_list_count)) { WRITE_LOG("Error returned from delete_table()\n"); result = 1; goto error; } else { WRITE_LOG ("Passed delete_tables()\n"); } error: if (!result) { /* Destroy mutexes */ native_mutex_destroy(&LOCK_continent_records_array); native_mutex_destroy(&LOCK_country_records_array); } WRITE_LOG ("End of deinit\n\n"); fclose(outfile); return result; } /* pfs_example_component_population doesn't provide any service */ BEGIN_COMPONENT_PROVIDES(pfs_example_component_population) END_COMPONENT_PROVIDES() /* pfs_example_component requires/uses pfs_plugin_table service */ REQUIRES_SERVICE_PLACEHOLDER(pfs_plugin_table); BEGIN_COMPONENT_REQUIRES(pfs_example_component_population) REQUIRES_SERVICE(pfs_plugin_table) END_COMPONENT_REQUIRES() /* A list of metadata to describe the Component. */ BEGIN_COMPONENT_METADATA(pfs_example_component_population) METADATA("mysql.author", "Oracle Corporation") METADATA("mysql.license", "GPL") METADATA("test_property", "1") END_COMPONENT_METADATA() /* Declaration of the Component. */ DECLARE_COMPONENT(pfs_example_component_population, "mysql:pfs_example_component_population") pfs_example_component_population_init, pfs_example_component_population_deinit END_DECLARE_COMPONENT() /* Defines list of Components contained in this library. Note that for now we assume that library will have exactly one Component. */ DECLARE_LIBRARY_COMPONENTS &COMPONENT_REF(pfs_example_component_population) END_DECLARE_LIBRARY_COMPONENTS