Snake/SnakeServer/Server/sqldbwriter.cpp

419 lines
11 KiB
C++
Raw Normal View History

2019-04-29 14:39:48 +03:00
#include "playerdbdata.h"
2019-04-16 18:01:55 +03:00
#include "sqldbwriter.h"
#include <QRegularExpression>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <quasarapp.h>
#include <clientprotocol.h>
2019-04-22 13:03:30 +03:00
#include <factorynetobjects.h>
2019-04-16 18:01:55 +03:00
bool SqlDBWriter::exec(QSqlQuery *sq,const QString& sqlFile) {
QFile f(sqlFile);
bool result = true;
if (f.open(QIODevice::ReadOnly)) {
QString temp, delimiter = ";";
QTextStream stream(&f);
stream.setCodec("UTF8");
while(!stream.atEnd()) {
temp += stream.readLine();
if (temp.lastIndexOf("delimiter", -1, Qt::CaseInsensitive) > -1) {
temp.remove("delimiter", Qt::CaseInsensitive);
int last = temp.indexOf(QRegularExpression("[^ \f\n\r\t\v]")) + 1;
int begin = temp.lastIndexOf(QRegularExpression("[^ \f\n\r\t\v]"));
delimiter = temp.mid(begin, last - begin);
temp = "";
} else {
if (temp.lastIndexOf(delimiter) >- 1) {
temp.remove(delimiter);
result = result && sq->exec(temp);
if (!result) {
qCritical() << sq->lastError().text();
f.close();
return false;
}
temp = "";
}
}
}
f.close();
return result;
}
return false;
}
int SqlDBWriter::getLastIdItems() {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
return -1;
}
2019-04-16 18:01:55 +03:00
QString request = QString("SELECT MAX(id) FROM items");
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
2019-04-17 15:16:11 +03:00
return -1;
2019-04-16 18:01:55 +03:00
}
if (!query->next()) {
2019-04-17 15:16:11 +03:00
return -1;
2019-04-16 18:01:55 +03:00
}
return query->value(0).toInt();
}
int SqlDBWriter::getLastIdPlayers() {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
return -1;
}
2019-04-16 18:01:55 +03:00
QString request = QString("SELECT MAX(id) FROM players");
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
2019-04-17 15:16:11 +03:00
return -1;
2019-04-16 18:01:55 +03:00
}
if (!query->next()) {
2019-04-17 15:16:11 +03:00
return -1;
2019-04-16 18:01:55 +03:00
}
return query->value(0).toInt();
}
int SqlDBWriter::getPlayerId(const QString &gmail) {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
return -1;
}
2019-04-16 18:01:55 +03:00
QString request = QString("SELECT id from players where gmail='%0'").arg(gmail);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
2019-04-17 15:16:11 +03:00
return -1;
2019-04-16 18:01:55 +03:00
}
if (!query->next()) {
return -1;
}
return query->value("id").toInt();
}
2019-04-17 15:16:11 +03:00
bool SqlDBWriter::checkPlayer(int id) {
2019-04-16 18:01:55 +03:00
QString request = QString("SELECT id from players where id='%0'").arg(id);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
if (!query->next()) {
return false;
}
return true;
}
2019-04-17 15:16:11 +03:00
bool SqlDBWriter::checkItem(int idItem, int idOwner) {
2019-04-16 18:01:55 +03:00
if (idOwner >= 0 ) {
if (!checkPlayer(idOwner)) {
return false;
}
QString request = QString("SELECT item from ovners where player='%0' and item='%1'").
arg(idOwner).arg(idItem);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
if (!query->next()) {
return false;
}
return true;
}
2019-04-18 17:55:13 +03:00
QString request = QString("SELECT id from items where id='%0'").
2019-04-16 18:01:55 +03:00
arg(idItem);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
if (!query->next()) {
return false;
}
return true;
}
2019-04-29 14:39:48 +03:00
int SqlDBWriter::savePlayer(PlayerDBData *player) {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
return -1;
}
2019-04-29 14:39:48 +03:00
if (!player->isValid()) {
2019-04-22 13:03:30 +03:00
return -1;
}
2019-04-16 18:01:55 +03:00
QString request;
2019-04-29 14:39:48 +03:00
int id = player->id();
2019-04-16 18:01:55 +03:00
2019-04-22 13:03:30 +03:00
if (checkPlayer(id)) {
2019-04-16 18:01:55 +03:00
request = QString("UPDATE players SET name='%0', gmail='%1', money='%2',"
" avgrecord='%3', record='%4', lastOnline='%5',"
" onlinetime='%6', currentsnake='%7') WHERE id='%8' ").arg(
2019-04-29 14:39:48 +03:00
player->getName()).arg(
player->getGmail()).arg(
player->getMany()).arg(
player->getAvgRecord()).arg(
player->getRecord()).arg(
player->getLastOnline()).arg(
player->getOnlineTime()).arg(
player->getCureentSnake()).arg(
2019-04-16 18:01:55 +03:00
QString::number(id));
} else {
request = QString("INSERT INTO players(id, name, gmail, money, avgrecord, record,"
" lastOnline, onlinetime, currentsnake) VALUES "
"('%0', '%1', '%2', '%3', '%4', '%5', '%6', '%7', '%8')").arg(
2019-04-29 14:39:48 +03:00
id).arg(
player->getName()).arg(
player->getGmail()).arg(
player->getMany()).arg(
player->getAvgRecord()).arg(
player->getRecord()).arg(
player->getLastOnline()).arg(
player->getOnlineTime()).arg(
player->getCureentSnake());
2019-04-16 18:01:55 +03:00
}
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
2019-04-22 13:03:30 +03:00
return id;
2019-04-16 18:01:55 +03:00
}
2019-04-29 14:39:48 +03:00
int SqlDBWriter::saveItem(ClientProtocol::BaseNetworkObject *item) {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
return -1;
}
2019-04-29 14:39:48 +03:00
if (item->isValid()) {
2019-04-22 13:03:30 +03:00
return -1;
}
2019-04-29 14:39:48 +03:00
auto type = item->getClass();
2019-04-16 18:01:55 +03:00
2019-04-29 14:39:48 +03:00
int id = item->id();
2019-04-16 18:01:55 +03:00
QByteArray bytes;
QString request;
2019-04-29 14:39:48 +03:00
item->toBytes(bytes);
2019-04-16 18:01:55 +03:00
if (checkItem(id)) {
2019-04-19 15:45:16 +03:00
request = QString("UPDATE items SET type='%1', data = :bytes where id = %0").
2019-04-16 18:01:55 +03:00
arg(id).
arg(static_cast<int>(type));
} else {
2019-04-19 15:45:16 +03:00
request = QString("INSERT INTO items(id, type, data) VALUES"
"('%0', '%1', :bytes)").
2019-04-16 18:01:55 +03:00
arg(id).
arg(static_cast<int>(type));
}
2019-04-19 15:45:16 +03:00
if (!query->prepare(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return -1;
}
2019-04-16 18:01:55 +03:00
2019-04-19 15:45:16 +03:00
query->bindValue(":bytes", bytes);
2019-04-16 18:01:55 +03:00
2019-04-19 15:45:16 +03:00
if (!query->exec()) {
2019-04-16 18:01:55 +03:00
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
2019-04-19 15:45:16 +03:00
return -1;
2019-04-16 18:01:55 +03:00
}
return id;
}
2019-04-17 15:16:11 +03:00
bool SqlDBWriter::getAllItemsOfPalyer(int player, QSet<int> &items) {
if (!isValid()) {
return false;
}
2019-04-16 18:01:55 +03:00
QString request = QString("SELECT item from owners where player='%0'").arg(player);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
while (query->next()) {
items.insert(query->value(0).toInt());
}
return true;
}
2019-04-17 15:16:11 +03:00
bool SqlDBWriter::saveOvners(int player, const QSet<int> items) {
if (!isValid()) {
return false;
}
2019-04-16 18:01:55 +03:00
QString request = QString("DELETE from owners where player='%0' ").
arg(player).arg(player);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
request = QString("INSERT INTO owners(player, items) VALUES(");
for (int item: items) {
request.push_back("(" + QString::number(player) + "," + QString::number(item) + ")");
}
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog(request);
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
return true;
}
2019-04-29 14:39:48 +03:00
PlayerDBData * SqlDBWriter::getPlayer(int id) {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
2019-04-29 14:39:48 +03:00
return nullptr;
2019-04-17 15:16:11 +03:00
}
QString request = QString("SELECT * FROM players WHERE id=%0").arg(id);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
2019-04-29 14:39:48 +03:00
return nullptr;
2019-04-17 15:16:11 +03:00
}
if (!query->next()) {
2019-04-29 14:39:48 +03:00
return nullptr;
2019-04-17 15:16:11 +03:00
}
2019-04-29 14:39:48 +03:00
auto player = new PlayerDBData();
player->setName(query->value("name").toString());
player->setGmail(query->value("gmail").toString());
player->setMany(query->value("money").toUInt());
player->setAvgRecord(query->value("avgrecord").toUInt());
player->setRecord(query->value("record").toUInt());
player->setLastOnline(query->value("lastOnline").toInt());
player->setOnlineTime(query->value("onlinetime").toInt());
player->setCureentSnake(query->value("currentsnake").toInt());
return player;
2019-04-17 15:16:11 +03:00
}
2019-04-29 14:39:48 +03:00
ClientProtocol::BaseNetworkObject *SqlDBWriter::getItem(int id) {
2019-04-17 15:16:11 +03:00
if (!isValid()) {
2019-04-29 14:39:48 +03:00
return nullptr;
2019-04-17 15:16:11 +03:00
}
2019-04-29 14:39:48 +03:00
QString request = QString("SELECT type, data FROM items WHERE id=%0").arg(id);
2019-04-17 15:16:11 +03:00
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
2019-04-29 14:39:48 +03:00
return nullptr;
2019-04-17 15:16:11 +03:00
}
if (!query->next()) {
2019-04-29 14:39:48 +03:00
return nullptr;
2019-04-17 15:16:11 +03:00
}
2019-04-29 14:39:48 +03:00
auto type = static_cast<quint8>(query->value(1).toUInt());
auto data = query->value(1).toByteArray();
auto obj = ClientProtocol::FactoryNetObjects::build(type);
if (!obj)
return nullptr;
obj->fromBytes(data);
return obj;
2019-04-17 15:16:11 +03:00
}
bool SqlDBWriter::itemIsFreeFrom(int item) const {
if (!isValid()) {
return false;
}
QString request = QString("SELECT player FROM owners WHERE id=%0").arg(item);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return false;
}
return !query->next();
}
2019-04-16 18:01:55 +03:00
SqlDBWriter::SqlDBWriter() {
}
bool SqlDBWriter::initDb(const QString& database, const QString &databasePath) {
QStringList drivers = QSqlDatabase::drivers();
db = new QSqlDatabase();
*db = QSqlDatabase::addDatabase("QSQLITE", database);
db->setDatabaseName(QFileInfo(databasePath).absolutePath() + "/" + database);
query = new QSqlQuery(*db);
if (!db->open()) {
return false;
}
if (!exec(query, ":/sql/DB")) {
return false;
}
initSuccessful = true;
return initSuccessful;
}
bool SqlDBWriter::isValid() const {
if (!db) {
return false;
}
return db->isValid() && db->isOpen() && initSuccessful;
}
SqlDBWriter::~SqlDBWriter() {
if (db) {
delete db;
}
if (query) {
delete query;
}
}