Heart/NetworkProtocol/sqldbcache.cpp

221 lines
5.4 KiB
C++
Raw Normal View History

2019-10-22 17:59:56 +03:00
#include "sqldbcache.h"
#include "quasarapp.h"
2019-10-26 20:53:47 +03:00
#include "sqldbwriter.h"
2019-10-23 20:32:13 +03:00
2019-11-09 13:49:14 +03:00
#include <networkprotocol.h>
2019-10-27 12:35:23 +03:00
#include <dbobject.h>
2019-10-22 17:59:56 +03:00
#include <QDateTime>
2019-10-26 20:53:47 +03:00
#include <QtConcurrent/QtConcurrent>
2019-10-23 20:32:13 +03:00
2019-10-22 17:59:56 +03:00
2019-11-09 13:49:14 +03:00
namespace NetworkProtocol {
2019-10-22 17:59:56 +03:00
void SqlDBCache::globalUpdateDataBasePrivate(qint64 currentTime) {
2019-10-28 21:44:41 +03:00
QMutexLocker lock(&_saveLaterMutex);
for (auto listIt = _needToSaveCache.begin(); listIt != _needToSaveCache.end(); ++listIt ) {
auto list = listIt.value();
for (int id: list) {
auto saveObject = _cache.value(listIt.key()).value(id);
if (!saveObject.isNull() && !_writer.isNull() && _writer->isValid()) {
if (!saveObject->isValid()) {
deleteFromCache(listIt.key(), id);
QuasarAppUtils::Params::verboseLog("writeUpdateItemIntoDB failed when"
" db object is not valid! id=" + QString::number(id),
QuasarAppUtils::VerboseLvl::Error);
continue;
}
if (!_writer->saveObject(saveObject)) {
QuasarAppUtils::Params::verboseLog("writeUpdateItemIntoDB failed when"
" work globalUpdateDataRelease!!! id=" +
QString::number(id),
QuasarAppUtils::VerboseLvl::Error);
}
QuasarAppUtils::Params::verboseLog("writeUpdateItemIntoDB failed when"
" db writer is npt inited! ",
QuasarAppUtils::VerboseLvl::Error);
}
}
}
lastUpdateTime = currentTime;
2019-10-22 17:59:56 +03:00
}
void SqlDBCache::globalUpdateDataBase(SqlDBCasheWriteMode mode) {
qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
if (currentTime - lastUpdateTime > updateInterval ||
static_cast<bool>(mode & SqlDBCasheWriteMode::Force)) {
if (static_cast<bool>(mode & SqlDBCasheWriteMode::On_New_Thread)) {
QtConcurrent::run([currentTime, this](){
globalUpdateDataBasePrivate(currentTime);
});
} else {
globalUpdateDataBasePrivate(currentTime);
}
}
}
SqlDBCache::SqlDBCache(qint64 updateInterval) {
lastUpdateTime = QDateTime::currentMSecsSinceEpoch();
this->updateInterval = updateInterval;
}
SqlDBCache::~SqlDBCache() {
globalUpdateDataBase(SqlDBCasheWriteMode::Force);
}
2019-10-28 21:44:41 +03:00
QWeakPointer<SqlDBWriter> SqlDBCache::writer() const {
2019-10-23 20:32:13 +03:00
return _writer;
}
2019-10-28 21:44:41 +03:00
void SqlDBCache::setWriter(QWeakPointer<SqlDBWriter> writer) {
2019-10-23 20:32:13 +03:00
_writer = writer;
}
2019-11-26 18:13:28 +03:00
bool SqlDBCache::getObject(QSharedPointer<DBObject> &obj) {
if (obj.isNull())
2019-10-27 12:35:23 +03:00
return false;
2019-11-26 18:13:28 +03:00
int id = obj->getId();
auto table = obj->tableName();
2019-11-24 14:44:50 +03:00
2019-10-27 12:35:23 +03:00
auto& tableObj = _cache[table];
2019-10-28 21:44:41 +03:00
if (!tableObj.contains(id) && !_writer.isNull() && _writer->isValid()) {
2019-11-24 14:44:50 +03:00
if (!_writer->getObject(obj)) {
2019-11-03 16:03:00 +03:00
return false;
}
2019-11-29 15:32:30 +03:00
saveToCache(obj);
2019-11-03 16:03:00 +03:00
return true;
2019-10-27 12:35:23 +03:00
}
2019-10-28 21:44:41 +03:00
auto &sptr = tableObj[id];
2019-10-28 18:16:35 +03:00
2019-11-29 15:32:30 +03:00
if (!sptr->isCached() && _writer->getObject(sptr)) {
saveToCache(sptr);
}
2019-10-28 21:44:41 +03:00
if (!sptr->isValid()) {
2019-10-28 18:16:35 +03:00
deleteFromCache(table, id);
return false;
}
2019-10-27 12:35:23 +03:00
2019-11-24 14:44:50 +03:00
obj = sptr;
2019-10-27 12:35:23 +03:00
return true;
2019-10-27 12:08:16 +03:00
}
2019-11-27 17:24:08 +03:00
QSharedPointer<DBObject> &SqlDBCache::getObjectFromCache(const QString &table, int id) {
auto& tableObj = _cache[table];
return tableObj[id];
}
2019-11-24 14:44:50 +03:00
bool SqlDBCache::saveObject(const QWeakPointer<DBObject>& saveObject) {
2019-10-28 21:44:41 +03:00
auto ptr = saveObject.toStrongRef();
if (!(ptr.isNull() && ptr->isValid())) {
return false;
}
2019-11-29 15:32:30 +03:00
saveToCache(ptr);
2019-10-28 21:44:41 +03:00
if (getMode() == SqlDBCasheWriteMode::Force) {
if (!_writer.isNull() && _writer->isValid()) {
2019-11-27 17:34:47 +03:00
if (!_writer->saveObject(saveObject)) {
return false;
}
return true;
2019-10-28 21:44:41 +03:00
}
} else {
2019-11-03 16:03:00 +03:00
_needToSaveCache[ptr->tableName()].push_back(ptr->getId());
2019-10-29 18:31:01 +03:00
globalUpdateDataBase(_mode);
2019-10-28 21:44:41 +03:00
}
return true;
2019-10-27 12:08:16 +03:00
}
2019-11-24 14:44:50 +03:00
bool SqlDBCache::deleteObject(const QWeakPointer<DBObject> &delObj) {
auto ref = delObj.toStrongRef();
if (ref.isNull())
return false;
deleteFromCache(ref->tableName(), ref->getId());
2019-10-28 18:16:35 +03:00
if (_writer && _writer->isValid()) {
2019-11-24 14:44:50 +03:00
return _writer->deleteObject(delObj);
2019-10-28 18:16:35 +03:00
}
return false;
2019-10-27 12:08:16 +03:00
}
2019-10-26 20:53:47 +03:00
bool SqlDBCache::init(const QString &initDbParams) {
2019-10-22 17:59:56 +03:00
2019-10-28 21:44:41 +03:00
if (_writer.isNull()) {
2019-10-22 17:59:56 +03:00
return false;
}
2019-10-28 21:55:48 +03:00
return _writer->initDb(initDbParams);
2019-10-22 17:59:56 +03:00
}
2019-10-23 20:32:13 +03:00
2019-10-31 18:15:20 +03:00
bool SqlDBCache::init(const QVariantMap &params) {
if (_writer.isNull()) {
return false;
}
return _writer->initDb(params);
}
2019-10-28 18:16:35 +03:00
void SqlDBCache::deleteFromCache(const QString &table, int id) {
auto& tableObj = _cache[table];
tableObj.remove(id);
if (tableObj.isEmpty()) {
_cache.remove(table);
}
}
2019-11-29 15:32:30 +03:00
void SqlDBCache::saveToCache(QSharedPointer<DBObject> &obj) {
// bug : pointer is rewrited!!!!
_cache[obj->tableName()][obj->getId()] = obj;
emit sigItemChanged(obj);
}
2019-10-28 21:44:41 +03:00
SqlDBCasheWriteMode SqlDBCache::getMode() const {
return _mode;
}
void SqlDBCache::setMode(const SqlDBCasheWriteMode &mode) {
_mode = mode;
}
qint64 SqlDBCache::getUpdateInterval() const {
return updateInterval;
}
void SqlDBCache::setUpdateInterval(const qint64 &value) {
updateInterval = value;
}
2019-10-23 20:32:13 +03:00
}