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>
|
|
|
|
#include <streamers.h>
|
|
|
|
|
|
|
|
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-17 15:16:11 +03:00
|
|
|
int SqlDBWriter::savePlayer(QVariantMap &player) {
|
|
|
|
if (!isValid()) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2019-04-16 18:01:55 +03:00
|
|
|
QString request;
|
|
|
|
int id = player.value("id").toInt();
|
|
|
|
|
|
|
|
if (id < 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (checkItem(id)) {
|
|
|
|
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(
|
|
|
|
player.value("name").toString(),
|
|
|
|
player.value("money").toString(),
|
|
|
|
player.value("avgrecord").toString(),
|
|
|
|
player.value("record").toString(),
|
|
|
|
player.value("lastOnline").toString(),
|
|
|
|
player.value("onlinetime").toString(),
|
|
|
|
player.value("currentsnake").toString(),
|
|
|
|
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(
|
|
|
|
player.value("id").toString(),
|
|
|
|
player.value("name").toString(),
|
|
|
|
player.value("money").toString(),
|
|
|
|
player.value("avgrecord").toString(),
|
|
|
|
player.value("record").toString(),
|
|
|
|
player.value("lastOnline").toString(),
|
|
|
|
player.value("onlinetime").toString(),
|
|
|
|
player.value("currentsnake").toString());
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!query->exec(request)) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
int SqlDBWriter::saveItem(QVariantMap &item) {
|
|
|
|
if (!isValid()) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2019-04-16 18:01:55 +03:00
|
|
|
auto type = static_cast<ClientProtocol::NetworkClasses::Type>
|
|
|
|
(item.value("command", ClientProtocol::NetworkClasses::Undefined).toInt());
|
|
|
|
|
|
|
|
int id = item.value("id", -1).toInt();
|
|
|
|
|
|
|
|
if (id < 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray bytes;
|
|
|
|
QString request;
|
|
|
|
|
|
|
|
if (!ClientProtocol::Streamers::write(bytes, item)) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
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-17 15:16:11 +03:00
|
|
|
bool SqlDBWriter::getPlayer(int id, QVariantMap &res) {
|
|
|
|
|
|
|
|
if (!isValid()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString request = QString("SELECT * 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;
|
|
|
|
}
|
|
|
|
res["name"] = query->value("name");
|
|
|
|
res["gmail"] = query->value("gmail");
|
|
|
|
res["money"] = query->value("money");
|
|
|
|
res["avgrecord"] = query->value("avgrecord");
|
|
|
|
res["record"] = query->value("record");
|
|
|
|
res["lastOnline"] = query->value("lastOnline");
|
|
|
|
res["onlinetime"] = query->value("onlinetime");
|
|
|
|
res["currentsnake"] = query->value("currentsnake");
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBWriter::getItem(int id, QVariantMap &res) {
|
|
|
|
|
|
|
|
if (!isValid()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString request = QString("SELECT data FROM items WHERE id=%0").arg(id);
|
|
|
|
if (!query->exec(request)) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!query->next()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
auto data = query->value(0).toByteArray();
|
|
|
|
|
|
|
|
return ClientProtocol::Streamers::read(data, res);
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|