Commit 62e0bc9b authored by Gavin Bisesi's avatar Gavin Bisesi
Browse files

Merge pull request #707 from ctrlaltca/servatrice_locking

Improvement to servatrice database interface
parents 3bf80540 ca9fffcf
...@@ -187,23 +187,21 @@ bool Servatrice::initServer() ...@@ -187,23 +187,21 @@ bool Servatrice::initServer()
const QString roomMethod = settingsCache->value("rooms/method").toString(); const QString roomMethod = settingsCache->value("rooms/method").toString();
if (roomMethod == "sql") { if (roomMethod == "sql") {
QSqlQuery query(servatriceDatabaseInterface->getDatabase()); QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select id, name, descr, auto_join, join_message from {prefix}_rooms order by id asc");
query.prepare("select id, name, descr, auto_join, join_message from " + dbPrefix + "_rooms order by id asc");
servatriceDatabaseInterface->execSqlQuery(query); servatriceDatabaseInterface->execSqlQuery(query);
while (query.next()) { while (query->next()) {
QSqlQuery query2(servatriceDatabaseInterface->getDatabase()); QSqlQuery *query2 = servatriceDatabaseInterface->prepareQuery("select name from {prefix}_rooms_gametypes where id_room = :id_room");
query2.prepare("select name from " + dbPrefix + "_rooms_gametypes where id_room = :id_room"); query2->bindValue(":id_room", query->value(0).toInt());
query2.bindValue(":id_room", query.value(0).toInt());
servatriceDatabaseInterface->execSqlQuery(query2); servatriceDatabaseInterface->execSqlQuery(query2);
QStringList gameTypes; QStringList gameTypes;
while (query2.next()) while (query2->next())
gameTypes.append(query2.value(0).toString()); gameTypes.append(query2->value(0).toString());
addRoom(new Server_Room(query.value(0).toInt(), addRoom(new Server_Room(query->value(0).toInt(),
query.value(1).toString(), query->value(1).toString(),
query.value(2).toString(), query->value(2).toString(),
query.value(3).toInt(), query->value(3).toInt(),
query.value(4).toString(), query->value(4).toString(),
gameTypes, gameTypes,
this this
)); ));
...@@ -360,11 +358,10 @@ void Servatrice::updateServerList() ...@@ -360,11 +358,10 @@ void Servatrice::updateServerList()
serverListMutex.lock(); serverListMutex.lock();
serverList.clear(); serverList.clear();
QSqlQuery query(servatriceDatabaseInterface->getDatabase()); QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select id, ssl_cert, hostname, address, game_port, control_port from {prefix}_servers order by id asc");
query.prepare("select id, ssl_cert, hostname, address, game_port, control_port from " + dbPrefix + "_servers order by id asc");
servatriceDatabaseInterface->execSqlQuery(query); servatriceDatabaseInterface->execSqlQuery(query);
while (query.next()) { while (query->next()) {
ServerProperties prop(query.value(0).toInt(), QSslCertificate(query.value(1).toString().toUtf8()), query.value(2).toString(), QHostAddress(query.value(3).toString()), query.value(4).toInt(), query.value(5).toInt()); ServerProperties prop(query->value(0).toInt(), QSslCertificate(query->value(1).toString().toUtf8()), query->value(2).toString(), QHostAddress(query->value(3).toString()), query->value(4).toInt(), query->value(5).toInt());
serverList.append(prop); serverList.append(prop);
qDebug() << QString("#%1 CERT=%2 NAME=%3 IP=%4:%5 CPORT=%6").arg(prop.id).arg(QString(prop.cert.digest().toHex())).arg(prop.hostname).arg(prop.address.toString()).arg(prop.gamePort).arg(prop.controlPort); qDebug() << QString("#%1 CERT=%2 NAME=%3 IP=%4:%5 CPORT=%6").arg(prop.id).arg(QString(prop.cert.digest().toHex())).arg(prop.hostname).arg(prop.address.toString()).arg(prop.gamePort).arg(prop.controlPort);
} }
...@@ -407,12 +404,11 @@ void Servatrice::updateLoginMessage() ...@@ -407,12 +404,11 @@ void Servatrice::updateLoginMessage()
if (!servatriceDatabaseInterface->checkSql()) if (!servatriceDatabaseInterface->checkSql())
return; return;
QSqlQuery query(servatriceDatabaseInterface->getDatabase()); QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select message from {prefix}_servermessages where id_server = :id_server order by timest desc limit 1");
query.prepare("select message from " + dbPrefix + "_servermessages where id_server = :id_server order by timest desc limit 1"); query->bindValue(":id_server", serverId);
query.bindValue(":id_server", serverId);
if (servatriceDatabaseInterface->execSqlQuery(query)) if (servatriceDatabaseInterface->execSqlQuery(query))
if (query.next()) { if (query->next()) {
const QString newLoginMessage = query.value(0).toString(); const QString newLoginMessage = query->value(0).toString();
loginMessageMutex.lock(); loginMessageMutex.lock();
loginMessage = newLoginMessage; loginMessage = newLoginMessage;
...@@ -447,14 +443,13 @@ void Servatrice::statusUpdate() ...@@ -447,14 +443,13 @@ void Servatrice::statusUpdate()
rxBytes = 0; rxBytes = 0;
rxBytesMutex.unlock(); rxBytesMutex.unlock();
QSqlQuery query(servatriceDatabaseInterface->getDatabase()); QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("insert into {prefix}_uptime (id_server, timest, uptime, users_count, games_count, tx_bytes, rx_bytes) values(:id, NOW(), :uptime, :users_count, :games_count, :tx, :rx)");
query.prepare("insert into " + dbPrefix + "_uptime (id_server, timest, uptime, users_count, games_count, tx_bytes, rx_bytes) values(:id, NOW(), :uptime, :users_count, :games_count, :tx, :rx)"); query->bindValue(":id", serverId);
query.bindValue(":id", serverId); query->bindValue(":uptime", uptime);
query.bindValue(":uptime", uptime); query->bindValue(":users_count", uc);
query.bindValue(":users_count", uc); query->bindValue(":games_count", gc);
query.bindValue(":games_count", gc); query->bindValue(":tx", tx);
query.bindValue(":tx", tx); query->bindValue(":rx", rx);
query.bindValue(":rx", rx);
servatriceDatabaseInterface->execSqlQuery(query); servatriceDatabaseInterface->execSqlQuery(query);
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <QObject> #include <QObject>
#include <QSqlDatabase> #include <QSqlDatabase>
#include <QHash>
#include "server.h" #include "server.h"
#include "server_database_interface.h" #include "server_database_interface.h"
...@@ -14,8 +15,9 @@ class Servatrice_DatabaseInterface : public Server_DatabaseInterface { ...@@ -14,8 +15,9 @@ class Servatrice_DatabaseInterface : public Server_DatabaseInterface {
private: private:
int instanceId; int instanceId;
QSqlDatabase sqlDatabase; QSqlDatabase sqlDatabase;
QHash<QString, QSqlQuery *> preparedStatements;
Servatrice *server; Servatrice *server;
ServerInfo_User evalUserQueryResult(const QSqlQuery &query, bool complete, bool withId = false); ServerInfo_User evalUserQueryResult(const QSqlQuery *query, bool complete, bool withId = false);
bool usernameIsValid(const QString &user); bool usernameIsValid(const QString &user);
protected: protected:
AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password, QString &reasonStr, int &secondsLeft); AuthenticationResult checkUserPassword(Server_ProtocolHandler *handler, const QString &user, const QString &password, QString &reasonStr, int &secondsLeft);
...@@ -27,7 +29,8 @@ public: ...@@ -27,7 +29,8 @@ public:
void initDatabase(const QString &type, const QString &hostName, const QString &databaseName, const QString &userName, const QString &password); void initDatabase(const QString &type, const QString &hostName, const QString &databaseName, const QString &userName, const QString &password);
bool openDatabase(); bool openDatabase();
bool checkSql(); bool checkSql();
bool execSqlQuery(QSqlQuery &query); QSqlQuery * prepareQuery(const QString &queryText);
bool execSqlQuery(QSqlQuery *query);
const QSqlDatabase &getDatabase() { return sqlDatabase; } const QSqlDatabase &getDatabase() { return sqlDatabase; }
bool userExists(const QString &user); bool userExists(const QString &user);
......
This diff is collapsed.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment