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;
|
|
|
|
}
|
|
|
|
}
|