#include // for cerr #include // for strdup #include // for free #include "CServer.h" CServer::CServer () { _num_servers = 0; _current_good_server = 0; } CServer::CServer (char *ip) { _num_servers = 0; AddServer (ip); } CServer::~CServer () { for (unsigned int i = 0; i < _ip_addr.size (); i++) free (_ip_addr [i]); } void CServer::AddServer (char *ip) { _ip_addr.push_back (strdup (ip)); _failures.push_back (0); _servers_to_use.push_back (_num_servers); _state.push_back (CServer::MySQL); _num_servers++; } int CServer::RemoveServer (SERVER_ID idnum) { int ret_val; if (_ip_addr.size () > 1) { // do not remove the last server! free (_ip_addr [idnum]); _ip_addr.erase (_ip_addr.begin () + idnum); _failures.erase (_failures.begin () + idnum); _servers_to_use.erase (_servers_to_use.begin () + idnum); _state.erase (_state.begin () + idnum); _num_servers--; ret_val = 1; } else ret_val = 0; return ret_val; } SERVER_ID CServer::GetCurrentServer () { if (_num_servers > 0) return _current_good_server; else return -1; } SERVER_ID CServer::GetNextServer (SERVER_ID current_id) { SERVER_ID num = current_id; if ((unsigned int) num + 1 >= _servers_to_use.size ()) { num = -1; _current_good_server = 0; // if we run out of server, // the last good one was 0 } else { num++; _current_good_server = num; } return (num); } void CServer::ServerFailure (SERVER_ID idnum) { _failures [idnum]++; // if the server that failed is the current server // and the number of failure is over three, we need to // go to another server if ((idnum == _current_good_server) && (_failures [idnum] > 3)) { if (RemoveServer (idnum) == 1) { std::cerr << _ip_addr [idnum] << " is no longer a good server.... We will remove it from the list!" << std::endl; // Remove the server and since everything got moved down one, we need to decrement // our cursor to the current good server if (_current_good_server > idnum) _current_good_server--; } } } char * CServer::GetServerIPFromID (SERVER_ID idnum) { return (_ip_addr [idnum]); } int CServer::GetNumServers () { return _num_servers; } void CServer::SetSQL (SERVER_ID idnum, SQL_STATE state) { _state [idnum] = state; } CServer::SQL_STATE CServer::IsSQL (SERVER_ID idnum) { return (_state [idnum]); }