diff options
Diffstat (limited to 'server-tools/instance-manager/instance.cc')
-rw-r--r-- | server-tools/instance-manager/instance.cc | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/server-tools/instance-manager/instance.cc b/server-tools/instance-manager/instance.cc new file mode 100644 index 00000000000..32e77429572 --- /dev/null +++ b/server-tools/instance-manager/instance.cc @@ -0,0 +1,152 @@ +/* Copyright (C) 2004 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef __GNUC__ +#pragma implementation +#endif + +#include "instance.h" +#include "mysql_manager_error.h" +#include <my_sys.h> +#include <signal.h> +#include <m_string.h> + + +/* + The method starts an instance. + + SYNOPSYS + start() + + RETURN + 0 ok + ER_CANNOT_START_INSTANCE Cannot start instance + ER_INSTANCE_ALREADY_STARTED The instance on the specified port/socket + is already started +*/ + +int Instance::start() +{ + + if (!is_running()) + { + switch (fork()) { + case 0: + if (fork()) /* zombie protection */ + exit(0); /* parent goes bye-bye */ + else + { + execv(options.mysqld_path, options.argv); + exit(1); + } + case -1: + return ER_CANNOT_START_INSTANCE; + default: + return 0; + } + } + + /* the instance is started already */ + return ER_INSTANCE_ALREADY_STARTED; +} + +int Instance::cleanup() +{ + /* + We cannot close connection in destructor, as mysql_close needs alarm + services which are definitely unavailaible at the time of destructor + call. + */ + if (is_connected) + mysql_close(&mysql); + return 0; +} + +Instance::~Instance() +{ + pthread_mutex_destroy(&LOCK_instance); +} + +bool Instance::is_running() +{ + pthread_mutex_lock(&LOCK_instance); + if (!is_connected) + { + mysql_init(&mysql); + if (mysql_real_connect(&mysql, LOCAL_HOST, options.mysqld_user, + options.mysqld_password, + NullS, atoi(strchr(options.mysqld_port, '=') + 1), + strchr(options.mysqld_socket, '=') + 1, 0)) + { + is_connected= TRUE; + pthread_mutex_unlock(&LOCK_instance); + return TRUE; + } + mysql_close(&mysql); + pthread_mutex_unlock(&LOCK_instance); + return FALSE; + } + else if (!mysql_ping(&mysql)) + { + pthread_mutex_unlock(&LOCK_instance); + return TRUE; + } + pthread_mutex_unlock(&LOCK_instance); + return FALSE; +} + + +/* + Stop an instance. + + SYNOPSYS + stop() + + RETURN: + 0 ok + ER_INSTANCE_IS_NOT_STARTED Looks like the instance it is not started + ER_STOP_INSTANCE mysql_shutdown reported an error +*/ + +int Instance::stop() +{ + if (is_running()) + { + if (mysql_shutdown(&mysql, SHUTDOWN_DEFAULT)) + goto err; + + mysql_close(&mysql); + is_connected= FALSE; + return 0; + } + + return ER_INSTANCE_IS_NOT_STARTED; +err: + return ER_STOP_INSTANCE; +} + + +/* + We execute this function to initialize instance parameters. + Return value: 0 - ok. 1 - unable to init DYNAMIC_ARRAY. +*/ + +int Instance::init(const char *name_arg) +{ + pthread_mutex_init(&LOCK_instance, 0); + + return options.init(name_arg); +} |