Changeset - 13979eacdd27
[Not reviewed]
0 1 0
HanzZ - 14 years ago 2011-08-13 17:52:04
hanzz.k@gmail.com
fetch all results from mysql
1 file changed with 9 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/mysqlbackend.cpp
Show inline comments
 
@@ -142,99 +142,100 @@ MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const
 
				m_results.back().buffer_type= MYSQL_TYPE_LONG;
 
				m_results.back().buffer= (int *) malloc(sizeof(int));
 
				m_results.back().is_null= 0;
 
				m_results.back().length= (unsigned long *) malloc(sizeof(unsigned long));
 
				break;
 
			case 'b':
 
				m_results.resize(m_results.size() + 1);
 
				memset(&m_results.back(), 0, sizeof(MYSQL_BIND));
 

	
 
				m_results.back().buffer_type= MYSQL_TYPE_TINY;
 
				m_results.back().buffer= (bool *) malloc(sizeof(bool));
 
				m_results.back().is_null= 0;
 
				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));
 
	}
 

	
 
	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));
 
		}
 
	}
 
	m_resultOffset = 0;
 
}
 

	
 
MySQLBackend::Statement::~Statement() {
 
	for (int i = 0; i < m_params.size(); i++) {
 
		free(m_params[i].buffer);
 
		free(m_params[i].length);
 
	}
 
	for (int i = 0; i < m_results.size(); i++) {
 
		free(m_results[i].buffer);
 
		free(m_results[i].length);
 
	}
 
	FINALIZE_STMT(m_stmt);
 
}
 

	
 
bool MySQLBackend::Statement::execute() {
 
	// If statement has some input and doesn't have any output, we have
 
	// to clear the offset now, because operator>> will not be called.
 
	m_offset = 0;
 
	m_resultOffset = 0;
 
	int ret;
 

	
 
	if (mysql_stmt_execute(m_stmt)) {
 
		LOG4CXX_ERROR(logger, m_string << " " << mysql_error(m_conn));
 
	if ((ret = mysql_stmt_execute(m_stmt)) != 0) {
 
		LOG4CXX_ERROR(logger, m_string << " " << mysql_stmt_error(m_stmt) << "; " << mysql_error(m_conn));
 
		return false;
 
	}
 
	return true;
 
}
 

	
 
int MySQLBackend::Statement::fetch() {
 
	return mysql_stmt_fetch(m_stmt);
 
}
 

	
 
template <typename T>
 
MySQLBackend::Statement& MySQLBackend::Statement::operator << (const T& t) {
 
	if (m_offset >= m_params.size())
 
		return *this;
 
	int *data = (int *) m_params[m_offset].buffer;
 
	*data = (int) t;
 

	
 
	LOG4CXX_INFO(logger, "adding " << m_offset << ":" << (int) t);
 
	m_offset++;
 
	return *this;
 
}
 

	
 
MySQLBackend::Statement& MySQLBackend::Statement::operator << (const std::string& str) {
 
	if (m_offset >= m_params.size())
 
		return *this;
 
	LOG4CXX_INFO(logger, "adding " << m_offset << ":" << str << "(" << str.size() << ")");
 
	strncpy((char*) m_params[m_offset].buffer, str.c_str(), 4096);
 
	*m_params[m_offset].length = str.size();
 
	m_offset++;
 
	return *this;
 
}
 

	
 
template <typename T>
 
MySQLBackend::Statement& MySQLBackend::Statement::operator >> (T& t) {
 
	if (m_resultOffset > m_results.size())
 
		return *this;
 

	
 
	if (!m_results[m_resultOffset].is_null) {
 
		T *data = (T *) m_results[m_resultOffset].buffer;
 
		t = *data;
 
		std::cout << "getting " << m_resultOffset << " " << (int) t << "\n";
 
	}
 

	
 
	if (++m_resultOffset == m_results.size())
 
		m_resultOffset = 0;
 
	return *this;
 
}
 

	
 
MySQLBackend::Statement& MySQLBackend::Statement::operator >> (std::string& t) {
 
@@ -341,107 +342,108 @@ bool MySQLBackend::createDatabase() {
 
		exec("CREATE TABLE IF NOT EXISTS `" + m_prefix + "users` ("
 
				"`id` int(10) unsigned NOT NULL auto_increment,"
 
				"`jid` varchar(255) collate utf8_bin NOT NULL,"
 
				"`uin` varchar(4095) collate utf8_bin NOT NULL,"
 
				"`password` varchar(255) collate utf8_bin NOT NULL,"
 
				"`language` varchar(25) collate utf8_bin NOT NULL,"
 
				"`encoding` varchar(50) collate utf8_bin NOT NULL default 'utf8',"
 
				"`last_login` datetime,"
 
				"`vip` tinyint(1) NOT NULL  default '0',"
 
				"`online` tinyint(1) NOT NULL  default '0',"
 
				"PRIMARY KEY (`id`),"
 
				"UNIQUE KEY `jid` (`jid`)"
 
			") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;");
 

	
 
		exec("CREATE TABLE IF NOT EXISTS `" + m_prefix + "users_settings` ("
 
				"`user_id` int(10) unsigned NOT NULL,"
 
				"`var` varchar(50) collate utf8_bin NOT NULL,"
 
				"`type` smallint(4) unsigned NOT NULL,"
 
				"`value` varchar(255) collate utf8_bin NOT NULL,"
 
				"PRIMARY KEY (`user_id`,`var`),"
 
				"KEY `user_id` (`user_id`)"
 
			") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;");
 

	
 
		exec("CREATE TABLE IF NOT EXISTS `" + m_prefix + "db_version` ("
 
				"`ver` int(10) unsigned NOT NULL default '1',"
 
				"UNIQUE KEY `ver` (`ver`)"
 
			") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;");
 

	
 
		exec("INSERT INTO db_version (ver) VALUES ('2');");
 
	}
 

	
 
	return true;
 
}
 

	
 
bool MySQLBackend::exec(const std::string &query) {
 
	if (mysql_query(&m_conn, query.c_str())) {
 
		LOG4CXX_ERROR(logger, query << " " << mysql_error(&m_conn));
 
		return false;
 
	}
 
	return true;
 
}
 

	
 
void MySQLBackend::setUser(const UserInfo &user) {
 
	*m_setUser << user.jid << user.uin << user.password << user.language << user.encoding << user.vip;
 
	m_setUser->execute();
 
}
 

	
 
bool MySQLBackend::getUser(const std::string &barejid, UserInfo &user) {
 
	user.id = -1;
 
	*m_getUser << barejid;
 
	if (!m_getUser->execute())
 
		return false;
 

	
 
	if (m_getUser->fetch() == MYSQL_NO_DATA)
 
		return false;
 

	
 
	int ret = false;
 
	while (m_getUser->fetch() == 0) {
 
		ret = true;
 
		*m_getUser >> user.id >> user.jid >> user.uin >> user.password >> user.encoding >> user.language >> user.vip;
 
		std::cout << user.id << " " << user.jid << " " <<  user.uin << " " <<  user.password << " " <<  user.encoding << " " <<  user.language << " " <<  user.vip << "\n";
 
	return true;
 
	}
 

	
 
	return ret;
 
}
 

	
 
void MySQLBackend::setUserOnline(long id, bool online) {
 
	
 
}
 

	
 
long MySQLBackend::addBuddy(long userId, const BuddyInfo &buddyInfo) {
 
// 	"INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES (?, ?, ?, ?, ?, ?)"
 
	*m_addBuddy << userId << buddyInfo.legacyName << buddyInfo.subscription;
 
	*m_addBuddy << (buddyInfo.groups.size() == 0 ? "" : buddyInfo.groups[0]);
 
	*m_addBuddy << buddyInfo.alias << buddyInfo.flags;
 

	
 
	m_addBuddy->execute();
 

	
 
	long id = (long) mysql_insert_id(&m_conn);
 

	
 
// 	INSERT OR REPLACE INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?)
 
	*m_updateBuddySetting << userId << id << buddyInfo.settings.find("icon_hash")->first << (int) TYPE_STRING << buddyInfo.settings.find("icon_hash")->second.s;
 
	m_updateBuddySetting->execute();
 

	
 
	return id;
 
}
 

	
 
void MySQLBackend::updateBuddy(long userId, const BuddyInfo &buddyInfo) {
 
}
 

	
 
bool MySQLBackend::getBuddies(long id, std::list<BuddyInfo> &roster) {
 

	
 
	return true;
 
}
 

	
 
bool MySQLBackend::removeUser(long id) {
 
	
 
	*m_removeUser << (int) id;
 
	if (!m_removeUser->execute())
 
		return false;
 

	
 
	*m_removeUserSettings << (int) id;
 
	if (!m_removeUserSettings->execute())
 
		return false;
 

	
 
	*m_removeUserBuddies << (int) id;
 
	if (!m_removeUserBuddies->execute())
 
		return false;
 

	
 
	*m_removeUserBuddiesSettings << (int) id;
 
	if (!m_removeUserBuddiesSettings->execute())
 
		return false;
0 comments (0 inline, 0 general)