#include "dbredis.h" #include QSqlDatabase DBRedis::m_DataBase; QString DBRedis::m_ConnectName = "dbredis"; bool DBRedis::m_HasInit = false; DBRedis::DBRedis() { } DBRedis::~DBRedis() { if (m_DataBase.isOpen()) { m_DataBase.close(); } } int DBRedis::deleteExpiredEntries() { int res = init(); if (res) { return res; } qint64 currentTimestamp = QDateTime::currentDateTime().toSecsSinceEpoch(); QSqlQuery query(m_DataBase); query.prepare("DELETE FROM data_store WHERE expiry > 0 AND expiry < :currentTimestamp"); query.bindValue(":currentTimestamp", currentTimestamp); if (!query.exec()) { qDebug() << "Error deleting expired entries:" << query.lastError().text(); return 1; } return 0; } int DBRedis::setData(const QString & key, const QString & value, uint32_t expiry) { int res = deleteExpiredEntries(); if (res) { return res; } QSqlQuery query(m_DataBase); query.prepare("SELECT COUNT(*) FROM data_store WHERE key = :key"); query.bindValue(":key", key); if (!query.exec()) { qDebug() << "Error checking existing key"; return 1; } int count = 0; while (query.next()) { count += query.value(0).toInt(); } if (count > 0) { query.prepare("UPDATE data_store SET value = :value, expiry = :expiry WHERE key = :key"); query.bindValue(":value", value); query.bindValue(":expiry", expiry > 0 ? QDateTime::currentDateTime().toSecsSinceEpoch() + expiry : 0); query.bindValue(":key", key); } else { query.prepare("INSERT INTO data_store (key, value, expiry) VALUES (:key, :value, :expiry)"); query.bindValue(":key", key); query.bindValue(":value", value); query.bindValue(":expiry", expiry > 0 ? QDateTime::currentDateTime().toSecsSinceEpoch() + expiry : 0); } if (!query.exec()) { qDebug() << "Error setting value:" << query.lastError().text(); return 1; } return 0; } int DBRedis::getData(const QString & key, QString & value) { value.clear(); int res = deleteExpiredEntries(); if (res) { return res; } QSqlQuery query(m_DataBase); query.prepare("SELECT value FROM data_store WHERE key = :key"); query.bindValue(":key", key); if (!query.exec()) { qDebug() << "Error getting value:" << query.lastError().text(); return 1; } if (!query.next()) { qDebug() << "Error getting value:" << query.lastError().text(); return 2; } value = query.value(0).toString(); return 0; } int DBRedis::deleteData(const QString & key) { int res = deleteExpiredEntries(); if (res) { return res; } QSqlQuery query(m_DataBase); query.prepare("DELETE FROM data_store WHERE key = :key"); query.bindValue(":key", key); if (!query.exec()) { qDebug() << "Error deleting value:" << query.lastError().text(); return 1; } return 0; } int DBRedis::init() { if (m_HasInit) { return 0; } m_DataBase = QSqlDatabase::addDatabase("QSQLITE", m_ConnectName); m_DataBase.setDatabaseName("dbredis.db"); if (m_DataBase.open()) { QString table = "CREATE TABLE IF NOT EXISTS data_store(key TEXT, value TEXT, expiry INTEGER)"; QSqlQuery query(QSqlDatabase::database(m_ConnectName)); if (!query.exec(table.toUtf8())) { qDebug() << "Error deleting value:" << query.lastError().text(); return 1; } } else { qDebug() << "Error db open fail"; return 3; } m_HasInit = true; return 0; }