Changeset - be3af42a21a7
[Not reviewed]
0 2 0
Vitaly Takmazov - 7 years ago 2018-09-21 22:59:27
vitalyster@gmail.com
MySQLBackend: disable autoreconnect, control CR_SERVER_LOST manually

* correctly recreate prepared statements
* do not close connection while reconnecting
* signed/unsigned comparison fix
2 files changed with 6 insertions and 8 deletions:
0 comments (0 inline, 0 general)
include/transport/MySQLBackend.h
Show inline comments
 
@@ -126,13 +126,13 @@ class MySQLBackend : public StorageBackend
 
			private:
 
				MYSQL_STMT *m_stmt;
 
				MYSQL *m_conn;
 
				std::vector<MYSQL_BIND> m_params;
 
				std::vector<MYSQL_BIND> m_results;
 
				int m_error;
 
				unsigned m_resultOffset;
 
				int m_resultOffset;
 
				unsigned m_offset;
 
				std::string m_string;
 
		};
 

	
 
		MYSQL m_conn;
 
		Config *m_config;
libtransport/MySQLBackend.cpp
Show inline comments
 
@@ -27,13 +27,13 @@
 

	
 
#define EXEC(STMT, METHOD) \
 
	{\
 
	int ret = STMT->execute(); \
 
	if (ret == 0) \
 
		exec_ok = true; \
 
	else if (ret == CR_SERVER_LOST) { \
 
	else if (ret == CR_SERVER_LOST || ret == CR_SERVER_GONE_ERROR) { \
 
		LOG4CXX_INFO(logger, "MySQL connection lost. Reconnecting...");\
 
		disconnect(); \
 
		connect(); \
 
		return METHOD; \
 
	} \
 
	else \
 
@@ -49,13 +49,13 @@ MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const
 
	m_resultOffset = -1;
 
	m_conn = conn;
 
	m_offset = 0;
 
	m_string = statement;
 
	m_stmt = mysql_stmt_init(conn);
 
	if (mysql_stmt_prepare(m_stmt, statement.c_str(), statement.size())) {
 
		LOG4CXX_ERROR(logger, statement << " " << mysql_error(conn));
 
		LOG4CXX_ERROR(logger, statement << " " << mysql_stmt_error(m_stmt));
 
		return;
 
	}
 

	
 
	for (unsigned i = 0; i < format.length() && m_resultOffset == -1; i++) {
 
		switch (format.at(i)) {
 
			case 's':
 
@@ -123,20 +123,20 @@ MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const
 
				m_results.back().length= (unsigned long *) malloc(sizeof(unsigned long));
 
				break;
 
		}
 
	}
 

	
 
	if (mysql_stmt_bind_param(m_stmt, &m_params.front())) {
 
		LOG4CXX_ERROR(logger, statement << " " << mysql_error(conn));
 
		LOG4CXX_ERROR(logger, statement << " " << mysql_stmt_error(m_stmt));
 
	}
 

	
 
	if (m_resultOffset < 0)
 
		m_resultOffset = format.size();
 
	else {
 
		if (mysql_stmt_bind_result(m_stmt, &m_results.front())) {
 
			LOG4CXX_ERROR(logger, statement << " " << mysql_error(conn));
 
			LOG4CXX_ERROR(logger, statement << " " << mysql_stmt_error(m_stmt));
 
		}
 
	}
 
	m_resultOffset = 0;
 
}
 

	
 
MySQLBackend::Statement::~Statement() {
 
@@ -224,18 +224,17 @@ MySQLBackend::Statement& MySQLBackend::Statement::operator >> (std::string& t) {
 
}
 

	
 
MySQLBackend::MySQLBackend(Config *config) {
 
	m_config = config;
 
	m_prefix = CONFIG_STRING(m_config, "database.prefix");
 
	mysql_init(&m_conn);
 
	my_bool my_true = 1;
 
	mysql_options(&m_conn, MYSQL_OPT_RECONNECT, &my_true);
 
}
 

	
 
MySQLBackend::~MySQLBackend(){
 
	disconnect();
 
	mysql_close(&m_conn);
 
}
 

	
 
void MySQLBackend::disconnect() {
 
	LOG4CXX_INFO(logger, "Disconnecting");
 
	delete m_setUser;
 
	delete m_getUser;
 
@@ -254,13 +253,12 @@ void MySQLBackend::disconnect() {
 
	delete m_updateUserSetting;
 
	delete m_updateBuddySetting;
 
	delete m_getBuddySetting;
 
	delete m_setUserOnline;
 
	delete m_getOnlineUsers;
 
	delete m_getUsers;
 
	mysql_close(&m_conn);
 
}
 

	
 
bool MySQLBackend::connect() {
 
	LOG4CXX_INFO(logger, "Connecting MySQL server " << CONFIG_STRING(m_config, "database.server") << ", user " <<
 
		CONFIG_STRING(m_config, "database.user") << ", database " << CONFIG_STRING(m_config, "database.database") <<
 
		", port " << CONFIG_INT(m_config, "database.port")
0 comments (0 inline, 0 general)