Changeset - 6764937113b6
[Not reviewed]
0 3 0
Daniel Henninger - 13 years ago 2012-02-15 18:29:28
daniel@vorpalcloud.org
Removed auto-transaction postgres handlers in lieu of our own transaction calls. Updated config file to mention postgres.
3 files changed with 22 insertions and 20 deletions:
0 comments (0 inline, 0 general)
include/transport/pqxxbackend.h
Show inline comments
 
@@ -94,15 +94,15 @@ class PQXXBackend : public StorageBackend
 

	
 
		void beginTransaction();
 
		void commitTransaction();
 

	
 
	private:
 
		bool exec(const std::string &query, bool show_error = true);
 
		bool exec(pqxx::work &txn, const std::string &query, bool show_error = true);
 
		bool exec(pqxx::nontransaction &txn, const std::string &query, bool show_error = true);
 
		template<typename T>
 
		std::string quote(pqxx::work &txn, const T &t);
 
		std::string quote(pqxx::nontransaction &txn, const T &t);
 

	
 
		Config *m_config;
 
		std::string m_prefix;
 

	
 
		pqxx::connection *m_conn;
 
};
spectrum/src/sample2.cfg
Show inline comments
 
@@ -70,17 +70,17 @@ config = /etc/spectrum2/logging.cfg
 

	
 
# log4cxx/log4j logging configuration file in ini format used for backends.
 
backend_config = /etc/spectrum2/backend-logging.cfg
 

	
 
[database]
 
# Database backend type
 
# "sqlite3", "mysql" or "none" without database backend
 
# "sqlite3", "mysql", "pqxx", or "none" without database backend
 
type = none
 

	
 
# For SQLite3: Full path to database
 
# For MySQL: name of database
 
# For MySQL and PostgreSQL: name of database
 
# default database = /var/lib/spectrum2/$jid/database.sql
 
#database = jabber_transport
 

	
 
# Server.
 
#server = localhost
 

	
src/pqxxbackend.cpp
Show inline comments
 
@@ -122,22 +122,22 @@ bool PQXXBackend::createDatabase() {
 
	}
 

	
 
	return true;
 
}
 

	
 
template<typename T>
 
std::string PQXXBackend::quote(pqxx::work &txn, const T &t) {
 
std::string PQXXBackend::quote(pqxx::nontransaction &txn, const T &t) {
 
	return "'" + txn.esc(pqxx::to_string(t)) + "'";
 
}
 

	
 
bool PQXXBackend::exec(const std::string &query, bool show_error) {
 
	pqxx::work txn(*m_conn);
 
	pqxx::nontransaction txn(*m_conn);
 
	return exec(txn, query, show_error);
 
}
 

	
 
bool PQXXBackend::exec(pqxx::work &txn, const std::string &query, bool show_error) {
 
bool PQXXBackend::exec(pqxx::nontransaction &txn, const std::string &query, bool show_error) {
 
	try {
 
		txn.exec(query);
 
		txn.commit();
 
	}
 
	catch (std::exception& e) {
 
		if (show_error)
 
@@ -149,26 +149,26 @@ bool PQXXBackend::exec(pqxx::work &txn, const std::string &query, bool show_erro
 

	
 
void PQXXBackend::setUser(const UserInfo &user) {
 
	std::string encrypted = user.password;
 
	if (!CONFIG_STRING(m_config, "database.encryption_key").empty()) {
 
		encrypted = Util::encryptPassword(encrypted, CONFIG_STRING(m_config, "database.encryption_key"));
 
	}
 
	pqxx::work txn(*m_conn);
 
	pqxx::nontransaction txn(*m_conn);
 
	exec(txn, "INSERT INTO " + m_prefix + "users (jid, uin, password, language, encoding, last_login, vip) VALUES "
 
		 "(" + quote(txn, user.jid) + ","
 
		+ quote(txn, user.uin) + ","
 
		+ quote(txn, encrypted) + ","
 
		+ quote(txn, user.language) + ","
 
		+ quote(txn, user.encoding) + ","
 
		+ "NOW(),"
 
		+ (user.vip ? "'true'" : "'false'") +")");
 
}
 

	
 
bool PQXXBackend::getUser(const std::string &barejid, UserInfo &user) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 

	
 
		pqxx::result r = txn.exec("SELECT id, jid, uin, password, encoding, language, vip FROM " + m_prefix + "users WHERE jid="
 
			+ quote(txn, barejid));
 

	
 
		if (r.size() == 0) {
 
			return false;
 
@@ -189,23 +189,23 @@ bool PQXXBackend::getUser(const std::string &barejid, UserInfo &user) {
 

	
 
	return true;
 
}
 

	
 
void PQXXBackend::setUserOnline(long id, bool online) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 
		exec(txn, "UPDATE " + m_prefix + "users SET online=" + (online ? "'true'" : "'false'") + ", last_login=NOW() WHERE id=" + pqxx::to_string(id));
 
	}
 
	catch (std::exception& e) {
 
		LOG4CXX_ERROR(logger, e.what());
 
	}
 
}
 

	
 
bool PQXXBackend::getOnlineUsers(std::vector<std::string> &users) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 
		pqxx::result r = txn.exec("SELECT jid FROM " + m_prefix + "users WHERE online=1");
 

	
 
		for (pqxx::result::const_iterator it = r.begin(); it != r.end(); it++)  {
 
			users.push_back((*it)[0].as<std::string>());
 
		}
 
	}
 
@@ -215,49 +215,51 @@ bool PQXXBackend::getOnlineUsers(std::vector<std::string> &users) {
 
	}
 

	
 
	return true;
 
}
 

	
 
long PQXXBackend::addBuddy(long userId, const BuddyInfo &buddyInfo) {
 
	pqxx::work txn(*m_conn);
 
	pqxx::nontransaction txn(*m_conn);
 
	pqxx::result r = txn.exec("INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES "
 
		+ "(" + pqxx::to_string(userId) + ","
 
		+ quote(txn, buddyInfo.legacyName) + ","
 
		+ quote(txn, buddyInfo.subscription) + ","
 
		+ quote(txn, Util::serializeGroups(buddyInfo.groups)) + ","
 
		+ quote(txn, buddyInfo.alias) + ","
 
		+ pqxx::to_string(buddyInfo.flags) + ") RETURNING id");
 

	
 
	long id = r[0][0].as<long>();
 

	
 
	r = txn.exec("UPDATE " + m_prefix + "buddies_settings SET var = " + quote(txn, buddyInfo.settings.find("icon_hash")->first) + ", type = " + pqxx::to_string((int)TYPE_STRING) + ", value = " + quote(txn, buddyInfo.settings.find("icon_hash")->second.s) + " WHERE user_id = " + pqxx::to_string(userId) + " AND buddy_id = " + pqxx::to_string(id));
 
	if (r.affected_rows() == 0) {
 
		exec("INSERT INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES "
 
		txn.exec("INSERT INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES "
 
			+ "(" + pqxx::to_string(userId) + ","
 
			+ pqxx::to_string(id) + ","
 
			+ quote(txn, buddyInfo.settings.find("icon_hash")->first) + ","
 
			+ pqxx::to_string((int)TYPE_STRING) + ","
 
			+ quote(txn,  buddyInfo.settings.find("icon_hash")->second.s) + ")");
 
	}
 

	
 
	txn.commit();
 

	
 
	return id;
 
}
 

	
 
void PQXXBackend::updateBuddy(long userId, const BuddyInfo &buddyInfo) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 
		exec(txn, "UPDATE " + m_prefix + "buddies SET groups=" + quote(txn, Util::serializeGroups(buddyInfo.groups)) + ", nickname=" + quote(txn, buddyInfo.alias) + ", flags=" + pqxx::to_string(buddyInfo.flags) + ", subscription=" + quote(txn, buddyInfo.subscription) + " WHERE user_id=" + pqxx::to_string(userId) + " AND uin=" + quote(txn, buddyInfo.legacyName));
 
	}
 
	catch (std::exception& e) {
 
		LOG4CXX_ERROR(logger, e.what());
 
	}
 
}
 

	
 
bool PQXXBackend::getBuddies(long id, std::list<BuddyInfo> &roster) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 

	
 
		pqxx::result r = txn.exec("SELECT id, uin, subscription, nickname, groups, flags FROM " + m_prefix + "buddies WHERE user_id=" + pqxx::to_string(id) + " ORDER BY id ASC");
 
		for (pqxx::result::const_iterator it = r.begin(); it != r.end(); it++)  {
 
			BuddyInfo b;
 
			std::string group;
 

	
 
@@ -315,13 +317,13 @@ bool PQXXBackend::getBuddies(long id, std::list<BuddyInfo> &roster) {
 

	
 
	return false;
 
}
 

	
 
bool PQXXBackend::removeUser(long id) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 
		exec(txn, "DELETE FROM " + m_prefix + "users SET id=" + pqxx::to_string(id));
 
		exec(txn, "DELETE FROM " + m_prefix + "buddies SET user_id=" + pqxx::to_string(id));
 
		exec(txn, "DELETE FROM " + m_prefix + "user_settings SET user_id=" + pqxx::to_string(id));
 
		exec(txn, "DELETE FROM " + m_prefix + "buddies_settings SET user_id=" + pqxx::to_string(id));
 

	
 
		return true;
 
@@ -331,17 +333,17 @@ bool PQXXBackend::removeUser(long id) {
 
	}
 
	return false;
 
}
 

	
 
void PQXXBackend::getUserSetting(long id, const std::string &variable, int &type, std::string &value) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 

	
 
		pqxx::result r = txn.exec("SELECT type, value FROM " + m_prefix + "users_settings WHERE user_id=" + pqxx::to_string(id) + " AND var=" + quote(txn, variable));
 
		if (r.size() == 0) {
 
			exec(txn, "INSERT INTO " + m_prefix + "users_settings (user_id, var, type, value) VALUES(" + pqxx::to_string(id) + "," + quote(txn, variable) + "," + pqxx::to_string(type) + "," + quote(txn, value) + ")");
 
			txn.exec(txn, "INSERT INTO " + m_prefix + "users_settings (user_id, var, type, value) VALUES(" + pqxx::to_string(id) + "," + quote(txn, variable) + "," + pqxx::to_string(type) + "," + quote(txn, value) + ")");
 
		}
 
		else {
 
			type = r[0][0].as<int>();
 
			value = r[0][1].as<std::string>();
 
		}
 
	}
 
@@ -349,22 +351,22 @@ void PQXXBackend::getUserSetting(long id, const std::string &variable, int &type
 
		LOG4CXX_ERROR(logger, e.what());
 
	}
 
}
 

	
 
void PQXXBackend::updateUserSetting(long id, const std::string &variable, const std::string &value) {
 
	try {
 
		pqxx::work txn(*m_conn);
 
		pqxx::nontransaction txn(*m_conn);
 
		exec(txn, "UPDATE " + m_prefix + "users_settings SET value=" + quote(txn, value) + " WHERE user_id=" + pqxx::to_string(id) + " AND var=" + quote(txn, variable));
 
	}
 
	catch (std::exception& e) {
 
		LOG4CXX_ERROR(logger, e.what());
 
	}
 
}
 

	
 
void PQXXBackend::beginTransaction() {
 
	exec("START TRANSACTION;");
 
	exec("BEGIN;");
 
}
 

	
 
void PQXXBackend::commitTransaction() {
 
	exec("COMMIT;");
 
}
 

	
0 comments (0 inline, 0 general)