2019-04-16 18:01:55 +03:00
|
|
|
#include "sqldbcashe.h"
|
2019-04-17 15:16:11 +03:00
|
|
|
#include "quasarapp.h"
|
|
|
|
#include <qtconcurrentrun.h>
|
|
|
|
#include <clientprotocol.h>
|
|
|
|
|
|
|
|
#include <QDateTime>
|
2019-04-16 18:01:55 +03:00
|
|
|
|
|
|
|
int SqlDBCashe::generateIdForItem() const {
|
|
|
|
if (items.isEmpty()) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return items.lastKey() + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SqlDBCashe::generateIdForPalyer() const {
|
|
|
|
if (players.isEmpty()) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return players.lastKey() + 1;
|
|
|
|
}
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
bool SqlDBCashe::checkPlayer(int id) {
|
|
|
|
if (players.contains(id)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SqlDBWriter::checkPlayer(id)) {
|
|
|
|
|
|
|
|
QVariantMap player;
|
|
|
|
getPlayer(id, player);
|
|
|
|
if (savePlayer(player) < 0) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("not saved data into cache "
|
|
|
|
" SqlDBCashe::checkPlayer");
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::checkItem(int idItem, int idOwner) {
|
|
|
|
|
|
|
|
if (idOwner >= 0 ) {
|
|
|
|
|
|
|
|
if (owners.contains(idOwner)) {
|
|
|
|
auto items = owners.value(idOwner);
|
|
|
|
return items.contains(idItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SqlDBWriter::checkItem(idItem)) {
|
|
|
|
QSet<int> items;
|
|
|
|
if (!SqlDBWriter::getAllItemsOfPalyer(idOwner, items)) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("not loaded ovners data from cache "
|
|
|
|
" SqlDBCashe::checkItem");
|
|
|
|
}
|
|
|
|
|
|
|
|
owners.insert(idOwner, items);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (items.contains(idItem)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SqlDBWriter::checkItem(idItem)) {
|
|
|
|
|
|
|
|
QVariantMap item;
|
|
|
|
getItem(idItem, item);
|
|
|
|
if (saveItem(item) < 0) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("not saved data into cache "
|
|
|
|
" SqlDBCashe::checkItem");
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SqlDBCashe::globalUpdateDataBasePrivate(qint64 currentTime) {
|
|
|
|
QList<int> removeIds;
|
|
|
|
for (auto item = items.begin(); item != items.end(); ++item) {
|
|
|
|
if (SqlDBWriter::saveItem(item.value()) < 0) {
|
|
|
|
removeIds.push_back(item.key());
|
|
|
|
|
|
|
|
QuasarAppUtils::Params::verboseLog("writeUpdateItemIntoDB failed when"
|
|
|
|
" work globalUpdateDataRelease!!! id=" +
|
|
|
|
QString::number(item.key()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int id : removeIds) {
|
|
|
|
items.remove(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto player = players.begin(); player != players.end(); ++player) {
|
|
|
|
if (savePlayer(player.value()) < 0) {
|
|
|
|
removeIds.push_back(player.key());
|
|
|
|
QuasarAppUtils::Params::verboseLog("writeUpdatePlayerIntoDB failed when"
|
|
|
|
" work globalUpdateDataRelease!!! id=" +
|
|
|
|
QString::number(player.key()));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto owner = owners.begin(); owner != owners.end(); ++owner) {
|
|
|
|
if (saveOvners(owner.key(), owner.value())) {
|
|
|
|
QuasarAppUtils::Params::verboseLog("UpdateInfoOfOvners failed when"
|
|
|
|
" work globalUpdateDataRelease!!! id=" +
|
|
|
|
QString::number(owner.key()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
lastUpdateTime = currentTime;
|
|
|
|
}
|
|
|
|
|
2019-04-18 17:47:54 +03:00
|
|
|
void SqlDBCashe::globalUpdateDataBase(SqlDBCasheWriteMode mode) {
|
2019-04-17 15:16:11 +03:00
|
|
|
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
|
|
|
|
|
2019-04-18 17:47:54 +03:00
|
|
|
if (currentTime - lastUpdateTime > DEFAULT_UPDATE_INTERVAL ||
|
|
|
|
static_cast<bool>(mode & SqlDBCasheWriteMode::Force)) {
|
|
|
|
|
|
|
|
if (static_cast<bool>(mode & SqlDBCasheWriteMode::On_New_Thread)) {
|
|
|
|
|
|
|
|
QtConcurrent::run([currentTime, this](){
|
|
|
|
globalUpdateDataBasePrivate(currentTime);
|
|
|
|
});
|
|
|
|
|
|
|
|
} else {
|
2019-04-17 15:16:11 +03:00
|
|
|
globalUpdateDataBasePrivate(currentTime);
|
2019-04-18 17:47:54 +03:00
|
|
|
}
|
2019-04-17 15:16:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::itemIsFreeFrom(int item) const {
|
|
|
|
return SqlDBWriter::itemIsFreeFrom(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
SqlDBCashe::SqlDBCashe() {
|
|
|
|
}
|
|
|
|
|
|
|
|
SqlDBCashe::~SqlDBCashe() {
|
2019-04-18 17:47:54 +03:00
|
|
|
globalUpdateDataBase(SqlDBCasheWriteMode::Force);
|
2019-04-17 15:16:11 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::initDb(const QString &sql, const QString &path) {
|
|
|
|
if (!SqlDBWriter::initDb(sql, path)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariantMap temp;
|
|
|
|
if (int id = getLastIdItems()) {
|
|
|
|
getItem(id, temp);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (int id = getLastIdPlayers()) {
|
|
|
|
getPlayer(id, temp);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::getItem(int id, QVariantMap &res) {
|
|
|
|
auto item = items.value(id, QVariantMap{{"id", "-1"}});
|
|
|
|
if (item.value("id") != "-1") {
|
|
|
|
res = item;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SqlDBWriter::getItem(id, res)) {
|
|
|
|
items.insert(id, res);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
int SqlDBCashe::saveItem(QVariantMap &item) {
|
|
|
|
|
|
|
|
if (!ClientProtocol::isValidMap(item)) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int id = item.value("id", -1).toInt();
|
|
|
|
|
|
|
|
if (id < 0) {
|
|
|
|
id = generateIdForItem();
|
|
|
|
item.insert("id", id);
|
|
|
|
}
|
|
|
|
|
|
|
|
items.insert(id, item);
|
|
|
|
|
2019-04-18 17:47:54 +03:00
|
|
|
globalUpdateDataBase(SqlDBCasheWriteMode::On_New_Thread);
|
2019-04-17 15:16:11 +03:00
|
|
|
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::getPlayer(int id, QVariantMap &res) {
|
|
|
|
auto player = players.value(id, QVariantMap{{"id", "-1"}});
|
|
|
|
if (player.value("id") != "-1") {
|
|
|
|
res = player;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SqlDBWriter::getPlayer(id, res)) {
|
|
|
|
players.insert(id, res);
|
|
|
|
return true;
|
|
|
|
}
|
2019-04-16 18:01:55 +03:00
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
return false;
|
2019-04-16 18:01:55 +03:00
|
|
|
}
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
int SqlDBCashe::savePlayer(QVariantMap &player) {
|
|
|
|
if (!ClientProtocol::isValidMap(player)) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int id = player.value("id", -1).toInt();
|
|
|
|
|
|
|
|
if (id < 0) {
|
|
|
|
id = generateIdForItem();
|
|
|
|
player.insert("id", id);
|
|
|
|
}
|
2019-04-16 18:01:55 +03:00
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
players.insert(id, player);
|
|
|
|
|
2019-04-18 17:47:54 +03:00
|
|
|
globalUpdateDataBase(SqlDBCasheWriteMode::On_New_Thread);
|
2019-04-17 15:16:11 +03:00
|
|
|
|
|
|
|
return id;
|
2019-04-16 18:01:55 +03:00
|
|
|
}
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
bool SqlDBCashe::giveAwayItem(int player, int item) {
|
|
|
|
if (!isValid()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!checkItem(item, player)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (owners.contains(player)) {
|
|
|
|
auto &owner = owners[player];
|
|
|
|
owner.remove(item);
|
2019-04-18 17:47:54 +03:00
|
|
|
|
|
|
|
globalUpdateDataBase(SqlDBCasheWriteMode::On_New_Thread);
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::getItem(int player, int item, bool check) {
|
|
|
|
if (!isValid()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(checkPlayer(player) && checkItem(item))) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (check && !itemIsFreeFrom(item)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (owners.contains(player)) {
|
|
|
|
auto &owner = owners[player];
|
|
|
|
owner.insert(item);
|
2019-04-18 17:47:54 +03:00
|
|
|
|
|
|
|
globalUpdateDataBase(SqlDBCasheWriteMode::On_New_Thread);
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
QSet<int> items;
|
|
|
|
if (!getAllItemsOfPalyer(player, items)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (owners.contains(player)) {
|
|
|
|
auto &owner = owners[player];
|
|
|
|
owner.insert(item);
|
2019-04-18 17:47:54 +03:00
|
|
|
|
|
|
|
globalUpdateDataBase(SqlDBCasheWriteMode::On_New_Thread);
|
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::moveItem(int owner, int receiver, int item) {
|
|
|
|
return giveAwayItem(owner, item) && getItem(receiver, item, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool SqlDBCashe::getAllItemsOfPalyer(int player, QSet<int> &items) {
|
|
|
|
if (owners.contains(player)) {
|
|
|
|
items = owners[player];
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (SqlDBWriter::getAllItemsOfPalyer(player, items) &&
|
|
|
|
checkPlayer(player)) {
|
|
|
|
|
|
|
|
owners.insert(player, items);
|
|
|
|
return true;
|
|
|
|
}
|
2019-04-16 18:01:55 +03:00
|
|
|
|
2019-04-17 15:16:11 +03:00
|
|
|
return false;
|
2019-04-16 18:01:55 +03:00
|
|
|
}
|