fix pakcage data of intem

This commit is contained in:
Andrei Yankovich 2019-05-02 17:39:56 +03:00
parent eb6738369f
commit c7c3a04c85
10 changed files with 239 additions and 186 deletions

View File

@ -98,6 +98,15 @@ bool Package::create(const BaseNetworkObject *obj, Type type) {
return isValid();
}
bool Package::create(Command cmd, Type type, const QByteArray &data) {
hdr.command = static_cast<quint8>(cmd);
hdr.type = static_cast<quint8>(type);
hdr.size = static_cast<unsigned short>(data.size());
this->data = data;
return isValid();
}
bool Package::create(Command cmd, Type type) {

View File

@ -106,6 +106,17 @@ struct CLIENTPROTOCOLSHARED_EXPORT Package {
*/
BaseNetworkObject * parse() const;
template<class T>
bool parse(T& res) {
auto obj = static_cast<T*>(parse());
if (!obj)
return false;
res = *obj;
return true;
}
/**
* @brief create - fill package
* @param data - data of filled
@ -113,6 +124,17 @@ struct CLIENTPROTOCOLSHARED_EXPORT Package {
*/
bool create(const BaseNetworkObject *data, Type type);
/**
* @brief create
* @param cmd command of package
* @param type type
* @param data - data of filled
* @return
*/
bool create(Command cmd, Type type, const QByteArray& data);
/**
* @brief create
* @param cmd command of package

View File

@ -43,8 +43,8 @@ HEADERS += \
item.h \
mainserver.h \
playerdbdata.h \
server_global.h \ \
sqldbcache.h
server_global.h \
sqldbcache.h \
sqldbwriter.h
include($$PWD/../../QuasarAppLib/QuasarLib.pri)

View File

@ -1,6 +1,6 @@
#include "item.h"
#include "factorynetobjects.h"
#include <exception>
int Item::getId() const {
return id;
@ -10,6 +10,10 @@ void Item::setId(int value) {
id = value;
}
Item::Item() {
}
Item::Item(const ClientProtocol::Package &other) {
hdr = other.hdr;
data = other.data;
@ -26,6 +30,20 @@ Item::Item(const ClientProtocol::BaseNetworkObject *obj) {
id = obj->id();
}
Item::Item(ClientProtocol::Command cmd, const QByteArray &data) {
if (!create(cmd, ClientProtocol::Type::Stream, data)) {
throw std::runtime_error("Error create Item from BaseNetworkObject!");
}
ClientProtocol::BaseNetworkObject base;
base.fromBytes(data);
id = base.id();
}
Item::~Item() {
}
ClientProtocol::Command Item::cmd() const {
return static_cast<ClientProtocol::Command>(hdr.command);
}

View File

@ -10,14 +10,21 @@ private:
int id = -1;
public:
Item();
Item(const ClientProtocol::Package& other);
Item(const ClientProtocol::BaseNetworkObject* obj);
Item(ClientProtocol::Command cmd, const QByteArray& data);
~Item() override;
ClientProtocol::Command cmd() const;
const QByteArray& dataArray() const;
bool isValid() const override;
int getId() const;
void setId(int value);
template<class T>
bool parse(T& res) {
return ClientProtocol::Package::parse(res);
}
};
#endif // ITEM_H

View File

@ -30,8 +30,7 @@ bool SqlDBCache::checkPlayer(int id) {
if (SqlDBWriter::checkPlayer(id)) {
PlayerDBData *player = getPlayer(id);
if (savePlayer(*player) < 0) {
if (savePlayer(getPlayer(id)) < 0) {
QuasarAppUtils::Params::verboseLog("not saved data into cache "
" SqlDBCashe::checkPlayer");
}
@ -73,7 +72,7 @@ bool SqlDBCache::checkItem(int idItem, int idOwner) {
if (SqlDBWriter::checkItem(idItem)) {
ClientProtocol::BaseNetworkObject *item = getItem(idItem);
auto item = getItem(idItem);
if (saveItem(item) < 0) {
QuasarAppUtils::Params::verboseLog("not saved data into cache "
" SqlDBCashe::checkItem");
@ -164,18 +163,19 @@ bool SqlDBCache::initDb(const QString &sql, const QString &path) {
return true;
}
ClientProtocol::BaseNetworkObject * SqlDBCache::getItem(int id) {
Item SqlDBCache::getItem(int id) {
if (!isValid()) {
return nullptr;
}
auto item = items.value(id, nullptr);
auto item = items.value(id);
if (item && item->isValid()) {
if (item.isValid()) {
return item;
}
if ((item = SqlDBWriter::getItem(id))) {
item = SqlDBWriter::getItem(id);
if (item.isValid()) {
items.insert(id, item);
return item;
}
@ -183,19 +183,20 @@ ClientProtocol::BaseNetworkObject * SqlDBCache::getItem(int id) {
return nullptr;
}
int SqlDBCache::saveItem(const Item &item) {
int SqlDBCache::saveItem(const Item &saveData) {
if (!isValid()) {
return -1;
}
auto item = saveData;
int id = item->id();
int id = item.getId();
if (id < 0) {
id = generateIdForItem();
item->setId(id);
item.setId(id);
}
if (!item->isValid()) {
if (!item.isValid()) {
return -1;
}
items.insert(id, item);
@ -205,42 +206,45 @@ int SqlDBCache::saveItem(const Item &item) {
return id;
}
PlayerDBData* SqlDBCache::getPlayer(int id) {
PlayerDBData SqlDBCache::getPlayer(int id) {
if (!isValid()) {
return nullptr;
return PlayerDBData();
}
auto player = players.value(id, nullptr);
auto player = players.value(id);
if (player && player->isValid()) {
if (player.isValid()) {
return player;
}
if ((player = SqlDBWriter::getPlayer(id))) {
items.insert(id, player);
player = SqlDBWriter::getPlayer(id);
if (player.isValid()) {
players.insert(id, player);
return player;
}
return nullptr;
return PlayerDBData();
}
int SqlDBCache::savePlayer(const PlayerDBData &player) {
int SqlDBCache::savePlayer(const PlayerDBData &saveData) {
if (!isValid()) {
return -1;
}
int id = player->id();
auto player = saveData;
int id = player.id();
if (id < 0) {
id = generateIdForPalyer();
player->setId(id);
player.setId(id);
}
if (!player->isValid()) {
if (!player.isValid()) {
return -1;
}
int curSnake = player->getCureentSnake();
int curSnake = player.getCureentSnake();
if (curSnake >= 0 && !checkItem(curSnake, id)) {
return -1;

View File

@ -7,6 +7,7 @@
#include <QSet>
#include <QVariantMap>
#include <player.h>
#include "item.h"
#include <clientprotocol.h>
enum class SqlDBCasheWriteMode: int {
@ -25,8 +26,8 @@ private:
qint64 lastUpdateTime = 0;
qint64 updateInterval = DEFAULT_UPDATE_INTERVAL;
QMap <int, ClientProtocol::Package> items;
QMap <int, PlayerDBData*> players;
QMap <int, Item> items;
QMap <int, PlayerDBData> players;
QHash <int, QSet<int>> owners;
int generateIdForItem() const;
@ -47,9 +48,9 @@ public:
bool initDb(const QString &sql = DEFAULT_DB_NAME,
const QString &path = DEFAULT_DB_PATH) override;
ClientProtocol::BaseNetworkObject * getItem(int id) override;
int saveItem(const Item& item) override;
PlayerDBData* getPlayer(int id) override;
Item getItem(int id) override;
int saveItem(const Item& saveData) override;
PlayerDBData getPlayer(int id) override;
int savePlayer(const PlayerDBData &player) override;
bool giveAwayItem(int player, int item);

View File

@ -338,64 +338,57 @@ bool SqlDBWriter::saveowners(int player, const QSet<int> items) {
return true;
}
PlayerDBData * SqlDBWriter::getPlayer(int id) {
PlayerDBData SqlDBWriter::getPlayer(int id) {
if (!isValid()) {
return nullptr;
return PlayerDBData();
}
QString request = QString("SELECT * FROM players WHERE id=%0").arg(id);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return nullptr;
return PlayerDBData();
}
if (!query->next()) {
return nullptr;
return PlayerDBData();
}
auto player = new PlayerDBData();
auto player = 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());
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;
}
ClientProtocol::BaseNetworkObject *SqlDBWriter::getItem(int id) {
Item SqlDBWriter::getItem(int id) {
if (!isValid()) {
return nullptr;
return Item();
}
QString request = QString("SELECT type, data FROM items WHERE id=%0").arg(id);
if (!query->exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query->lastError().text());
return nullptr;
return Item();
}
if (!query->next()) {
return nullptr;
return Item();
}
auto type = static_cast<quint8>(query->value(0).toUInt());
auto type = static_cast<ClientProtocol::Command>(query->value(0).toUInt());
auto data = query->value(1).toByteArray();
auto obj = ClientProtocol::FactoryNetObjects::build(type);
if (!obj)
return nullptr;
obj->fromBytes(data);
return obj;
return Item(type, data);
}
bool SqlDBWriter::itemIsFreeFrom(int item) const {

View File

@ -43,8 +43,8 @@ protected:
virtual bool getAllItemsOfPalyer(int player, QSet<int>& items);
virtual PlayerDBData *getPlayer(int id);
virtual ClientProtocol::BaseNetworkObject * getItem(int id);
virtual PlayerDBData getPlayer(int id);
virtual Item getItem(int id);
virtual bool itemIsFreeFrom(int item) const;

View File

@ -261,198 +261,197 @@ void testSankeServer::testBaseSql() {
// TEST ITEM
ClientProtocol::Snake *resSnake;
ClientProtocol::Snake resSnake;
QVERIFY(db.saveItem(&snake) < 0);
snake.setId(0);
int id = db.saveItem(&snake);
QVERIFY(id == 0);
resSnake = static_cast<decltype (resSnake)>(db.getItem(id));
QVERIFY(resSnake);
QVERIFY(snake.getSpeed() == resSnake->getSpeed());
QVERIFY(snake.getSkillet() == resSnake->getSkillet());
QVERIFY(snake.getSnakeClass() == resSnake->getSnakeClass());
QVERIFY(snake.getClass() == resSnake->getClass());
QVERIFY(snake.id() == resSnake->id());
resSnake->setSnakeClass(10);
QVERIFY(id == db.saveItem(resSnake));
QVERIFY(db.getItem(id).parse(resSnake));
auto temp = static_cast<decltype (resSnake)>(db.getItem(id));
QVERIFY(snake.getSpeed() == resSnake.getSpeed());
QVERIFY(snake.getSkillet() == resSnake.getSkillet());
QVERIFY(snake.getSnakeClass() == resSnake.getSnakeClass());
QVERIFY(snake.getClass() == resSnake.getClass());
QVERIFY(snake.id() == resSnake.id());
QVERIFY(temp->getSnakeClass() == 10);
resSnake.setSnakeClass(10);
QVERIFY(id == db.saveItem(Item(&resSnake)));
delete temp;
delete resSnake;
ClientProtocol::Snake temp;
QVERIFY(db.getItem(id).parse(temp));
QVERIFY(temp.getSnakeClass() == 10);
// TEST PLAYER
// // TEST PLAYER
PlayerDBData *player = new PlayerDBData();
// PlayerDBData *player = new PlayerDBData();
player->setMany(10);
player->setLastOnline(1000);
player->setOnlineTime(1001);
player->setName("test");
player->setGmail("test@gmail.com");
player->setCureentSnake(0);
player->setToken(QCryptographicHash::hash("1", QCryptographicHash::Sha256));
// player->setMany(10);
// player->setLastOnline(1000);
// player->setOnlineTime(1001);
// player->setName("test");
// player->setGmail("test@gmail.com");
// player->setCureentSnake(0);
// player->setToken(QCryptographicHash::hash("1", QCryptographicHash::Sha256));
QVERIFY(db.savePlayer(player) < 0);
player->setId(0);
// QVERIFY(db.savePlayer(player) < 0);
// player->setId(0);
QVERIFY(db.savePlayer(player) < 0);
player->setCureentSnake(-1);
id = db.savePlayer(player);
QVERIFY(id == 0);
// QVERIFY(db.savePlayer(player) < 0);
// player->setCureentSnake(-1);
// id = db.savePlayer(player);
// QVERIFY(id == 0);
QVERIFY(!db.saveowners(id, QSet<int>() << 1));
QVERIFY(db.saveowners(id, QSet<int>() << 0));
// QVERIFY(!db.saveowners(id, QSet<int>() << 1));
// QVERIFY(db.saveowners(id, QSet<int>() << 0));
QSet<int> items;
QVERIFY(db.getAllItemsOfPalyer(id, items));
QVERIFY(items.contains(0));
QVERIFY(items.size() == 1);
// QSet<int> items;
// QVERIFY(db.getAllItemsOfPalyer(id, items));
// QVERIFY(items.contains(0));
// QVERIFY(items.size() == 1);
player->setCureentSnake(0);
id = db.savePlayer(player);
// player->setCureentSnake(0);
// id = db.savePlayer(player);
auto resPlayer = static_cast<decltype (player)>(db.getPlayer(id));
QVERIFY(resPlayer);
QVERIFY(player->getLastOnline() == resPlayer->getLastOnline());
QVERIFY(player->getMany() == resPlayer->getMany());
QVERIFY(player->getOnlineTime() == resPlayer->getOnlineTime());
QVERIFY(player->getName() == resPlayer->getName());
QVERIFY(player->getCureentSnake() == resPlayer->getCureentSnake());
// auto resPlayer = static_cast<decltype (player)>(db.getPlayer(id));
// QVERIFY(resPlayer);
// QVERIFY(player->getLastOnline() == resPlayer->getLastOnline());
// QVERIFY(player->getMany() == resPlayer->getMany());
// QVERIFY(player->getOnlineTime() == resPlayer->getOnlineTime());
// QVERIFY(player->getName() == resPlayer->getName());
// QVERIFY(player->getCureentSnake() == resPlayer->getCureentSnake());
player->setCureentSnake(3);
// player->setCureentSnake(3);
QVERIFY(db.savePlayer(player) < 0);
player->setCureentSnake(0);
player->setName("new");
QVERIFY(db.savePlayer(player) == id);
// QVERIFY(db.savePlayer(player) < 0);
// player->setCureentSnake(0);
// player->setName("new");
// QVERIFY(db.savePlayer(player) == id);
auto tempPlayer = static_cast<decltype (player)>(db.getPlayer(id));
// auto tempPlayer = static_cast<decltype (player)>(db.getPlayer(id));
QVERIFY(tempPlayer->getName() == "new");
// QVERIFY(tempPlayer->getName() == "new");
delete tempPlayer;
delete player;
// delete tempPlayer;
// delete player;
}
void testSankeServer::testSqlCache() {
SqlDBCache db;
// SqlDBCache db;
QFile::remove("./test.db");
// QFile::remove("./test.db");
bool init = db.initDb("test.db", "./");
// bool init = db.initDb("test.db", "./");
if (!init) {
QFile::remove("./test.db");
}
// if (!init) {
// QFile::remove("./test.db");
// }
QVERIFY(init);
// QVERIFY(init);
ClientProtocol::Snake snake;
snake.setSpeed(10);
snake.setSkillet(QList<float>() << 1);
snake.setSnakeClass(0);
// ClientProtocol::Snake snake;
// snake.setSpeed(10);
// snake.setSkillet(QList<float>() << 1);
// snake.setSnakeClass(0);
// TEST ITEM
// // TEST ITEM
ClientProtocol::Snake *resSnake;
int id = db.saveItem(&snake);
QVERIFY(id == 0);
// ClientProtocol::Snake *resSnake;
// int id = db.saveItem(&snake);
// QVERIFY(id == 0);
resSnake = static_cast<decltype (resSnake)>(db.getItem(id));
QVERIFY(resSnake);
QVERIFY(snake.getSpeed() == resSnake->getSpeed());
QVERIFY(snake.getSkillet() == resSnake->getSkillet());
QVERIFY(snake.getSnakeClass() == resSnake->getSnakeClass());
QVERIFY(snake.getClass() == resSnake->getClass());
QVERIFY(snake.id() == resSnake->id());
// resSnake = static_cast<decltype (resSnake)>(db.getItem(id));
// QVERIFY(resSnake);
// QVERIFY(snake.getSpeed() == resSnake->getSpeed());
// QVERIFY(snake.getSkillet() == resSnake->getSkillet());
// QVERIFY(snake.getSnakeClass() == resSnake->getSnakeClass());
// QVERIFY(snake.getClass() == resSnake->getClass());
// QVERIFY(snake.id() == resSnake->id());
resSnake->setSnakeClass(10);
QVERIFY(id == db.saveItem(resSnake));
// resSnake->setSnakeClass(10);
// QVERIFY(id == db.saveItem(resSnake));
auto temp = static_cast<decltype (resSnake)>(db.getItem(id));
// auto temp = static_cast<decltype (resSnake)>(db.getItem(id));
QVERIFY(temp->getSnakeClass() == 10);
// QVERIFY(temp->getSnakeClass() == 10);
// TEST PLAYER
// // TEST PLAYER
PlayerDBData *player = new PlayerDBData();
// PlayerDBData *player = new PlayerDBData();
player->setMany(10);
player->setLastOnline(1000);
player->setOnlineTime(1001);
player->setName("test");
player->setGmail("test@gmail.com");
player->setCureentSnake(0);
player->setToken(QCryptographicHash::hash("1", QCryptographicHash::Sha256));
// player->setMany(10);
// player->setLastOnline(1000);
// player->setOnlineTime(1001);
// player->setName("test");
// player->setGmail("test@gmail.com");
// player->setCureentSnake(0);
// player->setToken(QCryptographicHash::hash("1", QCryptographicHash::Sha256));
QVERIFY(db.savePlayer(player) < 0);
player->setCureentSnake(-1);
id = db.savePlayer(player);
QVERIFY(id == 0);
// QVERIFY(db.savePlayer(player) < 0);
// player->setCureentSnake(-1);
// id = db.savePlayer(player);
// QVERIFY(id == 0);
QVERIFY(!db.getItem(id, 1));
QVERIFY(db.getItem(id, 0));
// QVERIFY(!db.getItem(id, 1));
// QVERIFY(db.getItem(id, 0));
player->setCureentSnake(0);
QVERIFY(db.savePlayer(player) == id);
// player->setCureentSnake(0);
// QVERIFY(db.savePlayer(player) == id);
auto resPlayer = static_cast<decltype (player)>(db.getPlayer(id));
QVERIFY(resPlayer);
QVERIFY(player->getLastOnline() == resPlayer->getLastOnline());
QVERIFY(player->getMany() == resPlayer->getMany());
QVERIFY(player->getOnlineTime() == resPlayer->getOnlineTime());
QVERIFY(player->getName() == resPlayer->getName());
QVERIFY(player->getCureentSnake() == resPlayer->getCureentSnake());
// auto resPlayer = static_cast<decltype (player)>(db.getPlayer(id));
// QVERIFY(resPlayer);
// QVERIFY(player->getLastOnline() == resPlayer->getLastOnline());
// QVERIFY(player->getMany() == resPlayer->getMany());
// QVERIFY(player->getOnlineTime() == resPlayer->getOnlineTime());
// QVERIFY(player->getName() == resPlayer->getName());
// QVERIFY(player->getCureentSnake() == resPlayer->getCureentSnake());
player->setCureentSnake(3);
// player->setCureentSnake(3);
QVERIFY(db.savePlayer(player) < 0);
player->setCureentSnake(0);
player->setName("new");
QVERIFY(db.savePlayer(player) == id);
// QVERIFY(db.savePlayer(player) < 0);
// player->setCureentSnake(0);
// player->setName("new");
// QVERIFY(db.savePlayer(player) == id);
auto tempPlayer = static_cast<decltype (player)>(db.getPlayer(id));
// auto tempPlayer = static_cast<decltype (player)>(db.getPlayer(id));
QVERIFY(tempPlayer->getName() == "new");
// QVERIFY(tempPlayer->getName() == "new");
PlayerDBData *second_player = new PlayerDBData();
// PlayerDBData *second_player = new PlayerDBData();
second_player->setMany(10);
second_player->setLastOnline(1000);
second_player->setOnlineTime(1001);
second_player->setName("test2");
second_player->setGmail("test2@gmail.com");
second_player->setCureentSnake(-1);
second_player->setId(-1);
second_player->setToken(QCryptographicHash::hash("1", QCryptographicHash::Sha256));
// second_player->setMany(10);
// second_player->setLastOnline(1000);
// second_player->setOnlineTime(1001);
// second_player->setName("test2");
// second_player->setGmail("test2@gmail.com");
// second_player->setCureentSnake(-1);
// second_player->setId(-1);
// second_player->setToken(QCryptographicHash::hash("1", QCryptographicHash::Sha256));
QVERIFY(db.savePlayer(second_player) == 1);
// QVERIFY(db.savePlayer(second_player) == 1);
QVERIFY(db.moveItem(0, 1, 0));
// QVERIFY(db.moveItem(0, 1, 0));
QSet<int> items;
QVERIFY(db.getAllItemsOfPalyer(1, items));
QVERIFY(items.contains(0));
QVERIFY(items.size() == 1);
// QSet<int> items;
// QVERIFY(db.getAllItemsOfPalyer(1, items));
// QVERIFY(items.contains(0));
// QVERIFY(items.size() == 1);
db.updateInterval = 0;
// db.updateInterval = 0;
db.globalUpdateDataBasePrivate(0);
// db.globalUpdateDataBasePrivate(0);
}