/* Copyright (c) 2001, 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 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 #include #include "my_getopt.h" #include "abstract_options_provider.h" #include "i_options_provider.h" using std::vector; using std::string; using std::map; using namespace Mysql::Tools::Base::Options; using Mysql::Nullable; Simple_option* Abstract_options_provider::create_new_option( string name, string description) { return this->attach_new_option( new Simple_option(name, description)); } Disabled_option* Abstract_options_provider::create_new_disabled_option( string name, string description) { return this->attach_new_option( new Disabled_option(name, description)); } Char_array_option* Abstract_options_provider::create_new_option( char** value, string name, string description) { return this->attach_new_option( new Char_array_option(value, false, name, description)); } Password_option* Abstract_options_provider::create_new_password_option( Nullable* value, string name, string description) { return this->attach_new_option( new Password_option(value, name, description)); } String_option* Abstract_options_provider::create_new_option( Nullable* value, string name, string description) { return this->attach_new_option( new String_option(value, name, description)); } Number_option* Abstract_options_provider::create_new_option( int32* value, string name, string description) { return this->attach_new_option >( new Number_option(value, name, description)); } Number_option* Abstract_options_provider::create_new_option( uint32* value, string name, string description) { return this->attach_new_option >( new Number_option(value, name, description)); } Number_option* Abstract_options_provider::create_new_option( int64* value, string name, string description) { return this->attach_new_option >( new Number_option(value, name, description)); } Number_option* Abstract_options_provider::create_new_option( uint64* value, string name, string description) { return this->attach_new_option >( new Number_option(value, name, description)); } Number_option* Abstract_options_provider::create_new_option( double* value, string name, string description) { return this->attach_new_option >( new Number_option(value, name, description)); } Bool_option* Abstract_options_provider::create_new_option( bool* value, string name, string description) { return this->attach_new_option( new Bool_option(value, name, description)); } vector Abstract_options_provider::generate_options() { if (this->m_are_options_created == false) { this->m_are_options_created= true; this->create_options(); } vector res; for (vector::iterator it= this->m_options_created.begin(); it != this->m_options_created.end(); it++) { res.push_back((*it)->get_my_option()); } return res; } void Abstract_options_provider::options_parsed() {} Abstract_options_provider::Abstract_options_provider() : m_are_options_created(false), m_option_changed_listener(NULL) {} Abstract_options_provider::~Abstract_options_provider() { for (vector::iterator it= this->m_options_created.begin(); it != this->m_options_created.end(); it++) { delete *it; } } void Abstract_options_provider::set_option_changed_listener(I_option_changed_listener* listener) { DBUG_ASSERT(this->m_option_changed_listener == NULL); this->m_option_changed_listener= listener; } void Abstract_options_provider::notify_option_name_changed(I_option* source, string old_name) { // Check if it is modification or new assignment if (old_name != "") { this->m_name_usage.erase(this->m_name_usage.find(old_name)); } string new_name= source->get_my_option().name; // Try to find existing option with that name. map::iterator name_item = this->m_name_usage.find(new_name); // Report error if already used. if (name_item != this->m_name_usage.end()) { std::cerr << "Cannot register new option \"" << new_name << "\" as it collides with existing one with following name \"" << name_item->second->get_my_option().name << "\" and description: " << name_item->second->get_my_option().comment << std::endl; exit(1); } // Add name usage. this->m_name_usage.insert(std::make_pair(new_name, source)); // If we have listener we should inform it too. if (this->m_option_changed_listener != NULL) { this->m_option_changed_listener->notify_option_name_changed(source, old_name); } } void Abstract_options_provider::notify_option_optid_changed(I_option* source, uint32 old_optid) { // Check if it is modification or new assignment if (old_optid != 0) { this->m_optid_usage.erase(this->m_optid_usage.find(old_optid)); } uint32 new_optid= source->get_my_option().id; // Try to find existing option with that optid. map::iterator optid_item = this->m_optid_usage.find(new_optid); // Report error if already used. if (optid_item != this->m_optid_usage.end()) { string name= source->get_my_option().name; std::cerr << "Cannot register new option \"" << name << "\" as it collides with existing one with following name \"" << optid_item->second->get_my_option().name << "\" and description: " << optid_item->second->get_my_option().comment << std::endl; exit(1); } // Add optid usage. this->m_optid_usage.insert(std::make_pair(new_optid, source)); // If we have listener we should inform it too. if (this->m_option_changed_listener != NULL) { this->m_option_changed_listener->notify_option_optid_changed(source, old_optid); } }