00001 /* 00002 * Copyright (C) 2010, Edmundo Albuquerque de Souza e Silva. 00003 * 00004 * This file may be distributed under the terms of the Q Public License 00005 * as defined by Trolltech AS of Norway and appearing in the file 00006 * LICENSE.QPL included in the packaging of this file. 00007 * 00008 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING 00009 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00010 * PURPOSE. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 00012 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 00013 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 00014 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 00015 * 00016 */ 00017 00018 #ifndef __RIOSERVERFILE_H_ 00019 #define __RIOSERVERFILE_H_ 00020 00021 // Unidades usadas do apache 00022 #include <httpd.h> 00023 00024 // Unidades usadas do modulo 00025 #include "RioModuleTypes.h" 00026 #include "RioInterfaceTypes.h" 00027 00028 class CRioServersFile 00029 { 00030 private: 00031 // Variavel usada para indicar que um arquivo foi aberto com sucesso, 00032 // ou seja, se a classe foi corretamente inicializada. 00033 bool m_Initialized; 00034 // Ponteiro para a requisicao com os dados do pedido HTTP. 00035 request_rec *m_Request; 00036 // Vetor com as informacoes dos servidores (lido do arquivo passado a 00037 // funcao open. 00038 RioServerInfo *m_ServersInfo; 00039 // Numero de servidores no vetor m_ServersInfo. 00040 unsigned int m_TotalServers; 00041 // Posicao, no vetor m_ServersInfo, do servidor com o valor minimo de 00042 // MaxSessions. 00043 int m_BestMaxSessions; 00044 // Posicao, no vetor m_ServersInfo, do servidor com o valor minimo de 00045 // MaxAverage. 00046 int m_BestMaxAverage; 00047 // Armazena o tamanho maximo de uma linha do arquivo. 00048 unsigned int m_LineSize; 00049 // Variaveis usadas para armazenar os erros ocorridos durante o 00050 // processamento do arquivo com os servidores. 00051 apr_status_t m_ApacheStatus; // Erro gerado pelas funcoes da biblioteca 00052 // do apache. 00053 int m_SystemStatus; // Erro gerado pelas funcoes da biblioteca do 00054 // sistema. 00055 RioResult m_RioStatus; // Erro gerado pelas funcoes da biblioteca do 00056 // RIO. 00057 /** 00058 * Funcao para remover a lista com os servidores lidos do arquivo. 00059 */ 00060 void DeleteServersInfo(); 00061 /** 00062 * Funcao para remover os espacos iniciais (' ' e '\t') e finais de 00063 * uma linha. 00064 * @param Line ponteiro para um ponteiro com a linha que desejamos 00065 * remover os espacos. 00066 */ 00067 void RemoveSpaces( char **Line ); 00068 /** 00069 * Funcao para processar uma linha do arquivo com as informacoes dos 00070 * servidores. 00071 * @param FileName ponteiro para o nome do arquivo de onde a linha se 00072 * originou (isso e usado somente para a impressao de erros). 00073 * @param Line ponteiro para linha a ser processada. 00074 * @param LineNumber numero desta linha em FileName (tambem usado 00075 * somente para impressao de erros). 00076 * @param ServerInfo ponteiro para estrutura que recebera as informacoes 00077 * processadas da linha. 00078 * @return true se a linha foi processada com sucesso ou false se algum 00079 * erro ocorreu durante o processamento. 00080 */ 00081 bool ProcessLine( char *FileName, char *Line, unsigned int LineNumber, 00082 RioServerInfo *ServerInfo ); 00083 00084 public: 00085 /** 00086 * Construtor da classe, usado para criar um novo objeto para processar 00087 * os arquivos com as informacoes dos servidores. 00088 * @param Request ponteiro para a requisicao do apache associada ao 00089 * arquivo a ser lido. 00090 * @param LineSize Tamanho maximo de cada linha do arquivo. 00091 */ 00092 CRioServersFile( request_rec *Request, unsigned int LineSize ); 00093 /** 00094 * Destrutor da classe, usado para destruir um objeto da classe. 00095 */ 00096 ~CRioServersFile(); 00097 /** 00098 * Funcao para abrir o arquivo do servidor e inicializar as estruturas 00099 * internas da classe (com as informacoes sobre os servidores lidas 00100 * do arquivo). 00101 * @param FileName caminho do arquivo com os servidores. 00102 * @return true se o arquivo foi aberto e processado com sucesso ou 00103 * false se algum erro ocorreu durante o processamento (os erros, 00104 * neste caso, devem ser obtidos pela funcao GetErrors). 00105 */ 00106 bool Open( char *FileName ); 00107 /** 00108 * Funcao para escolher um dos servidores lidos do arquivo segundo o 00109 * criterio passado como parametro. 00110 * @param SelectionType Tipo de selecao que deve ser usada ao escolher 00111 * os servidores: 00112 * RIO_SELECTION_RANDOM - servidor escolhido de modo aleatorio. 00113 * RIO_SELECTION_L_LOAD - servidor com o menor numero maximo de 00114 * sessoes. 00115 * RIO_SELECTION_MV_AVG - servidor com o menor numero maximo da 00116 * media de sessoes. 00117 * RIO_SELECTION_FIRST - o primeiro servidor da lista e o "melhor". 00118 * Usado quando enviamos o arquivo para sabermos de qual servidor 00119 * obteremos o arquivo (que e o mesmo servidor onde o modulo esta 00120 * executando). 00121 * @param ServerInfo ponteiro para a estrutura que armazenara as 00122 * informacoes do servidor escolhido. 00123 * @return true se foi possivel escolher o melhor servidor segundo o 00124 * criterio escolhido, ou false se algum erro ocorreu durante o 00125 * processamento (os erros, neste caso, devem ser obtidos pela funcao 00126 * GetErrors). 00127 */ 00128 bool ChooseServer( ServerSelectionType SelectionType, 00129 RioServerInfo *ServerInfo ); 00130 /** 00131 * Funcao para retornar os codigos de erro caso alguma das funcoes 00132 * acima retorne false. 00133 * @param ApacheStatus ponteiro para a variavel que recebera o codigo de 00134 * erro retorado pelas funcoes do apache. 00135 * @param SystemStatus ponteiro para a variavel que recebera o codigo de 00136 * erro retornado pelas funcoes da biblioteca do sistema. 00137 * @param RioStatus ponteiro para a variavel que recebera o codigo de 00138 * erro retornado pelas funcoes do RIO. 00139 */ 00140 void GetErrors( apr_status_t *ApacheStatus, int *SystemStatus, 00141 RioResult *RioStatus ); 00142 }; 00143 00144 #endif 00145 00146