#include "databasemanager.h" DatabaseManager::DatabaseManager(QString host, QString dbName, QString user, QString password) { db = QSqlDatabase::addDatabase("QPSQL"); db.setDatabaseName(dbName); db.setHostName(host); db.setUserName(user); // home-office stuff //db.setPort(80); // db.setPassword(password); opened = db.open(); if (!opened) { qDebug() << "Opening error" + db.lastError().text(); } query = QSqlQuery("query", db); } void DatabaseManager::saveSubject(Subject* subject, QString table) { QString id = subject->idToStringWithoutBraces(); if (checkIfExists(id, table)) { query.prepare(QString("UPDATE %1 SET name = :name, last_update = :last_update " "WHERE id = :id)").arg(table)); query.bindValue(":id", id); query.bindValue(":name", subject->getName()); query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(subject->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz")); query.exec(); } else { query.prepare(QString("INSERT INTO %1 (id, name, last_update) " "VALUES (:id, :name, :last_update)").arg(table)); query.bindValue(":id", id); query.bindValue(":name", subject->getName()); query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(subject->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz")); query.exec(); } } void DatabaseManager::saveToken(Token* token, QString table) { QString id = token->idToStringWithoutBraces(); if (checkIfExists(id, table)) { query.prepare(QString("UPDATE %1 SET last_update = :last_update, token_data = :data, subject_id = :subject_id) " "WHERE id = :id").arg(table)); query.bindValue(":id", id); query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz")); query.bindValue(":data", token->getTokenData()); query.bindValue(":subject_id", token->subjectIdToStringWithoutBraces()); query.exec(); } else { query.prepare(QString("INSERT INTO %1 (id, last_update, token_data, subject_id) " "VALUES (:id, :last_update, :data, :subject_id)").arg(table)); query.bindValue(":id", id); query.bindValue(":last_update", QDateTime::fromMSecsSinceEpoch(token->getLastUpdate()).toString("yyyy-MM-dd hh:mm:ss.zzz")); query.bindValue(":data", token->getTokenData()); query.bindValue(":subject_id", token->subjectIdToStringWithoutBraces()); query.exec(); } } void DatabaseManager::saveSubjectAttribute(Subject *subject, QString table) { auto attributes = subject->getAtr(); for (auto attribute : attributes){ QString id = subject->idToStringWithoutBraces() + " " + attribute.first; if (checkIfExists(id, table)) { query.prepare(QString("UPDATE %1 SET id = :id, attribute_key = :key, attribute_value = :value, subject_id = :subject_id) " "WHERE id = :id").arg(table)); query.bindValue(":id", id); query.bindValue(":key", attribute.first); query.bindValue(":value", attribute.second); query.bindValue(":subject_id", subject->idToStringWithoutBraces()); query.exec(); } else { query.prepare(QString("INSERT INTO %1 (id, attribute_key, attribute_value, subject_id)" "VALUES (:id, :key, :value, :subject_id)").arg(table)); query.bindValue(":id", id); query.bindValue(":key", attribute.first); query.bindValue(":value", attribute.second); query.bindValue(":subject_id", subject->idToStringWithoutBraces()); query.exec(); } } } void DatabaseManager::deleteItem(QString id, QString table) { query.prepare(QString("DELETE FROM %1 WHERE id = :id").arg(table)); query.bindValue(":id", id); query.exec(); } QString DatabaseManager::getTestMessage(int id) { query.prepare("SELECT message FROM test WHERE id = :id"); query.bindValue(":id", id); query.exec(); query.next(); return query.value(0).toString(); } int DatabaseManager::createTestRecord(QString msg) { query.exec("SELECT MAX(id) FROM test"); query.next(); int id = query.value(0).toInt() + 1; query.prepare("INSERT INTO test (id, message) VALUES (:id, :msg)"); query.bindValue(":id", id); query.bindValue(":msg", msg); query.exec(); qDebug() << "U inserted new row, id: " << id << "msg: " << getTestMessage(id); return id; } bool DatabaseManager::checkIfExists(QString id, QString table) { query.prepare(QString("SELECT EXISTS(SELECT 1 FROM %1 WHERE id = :id)").arg(table)); query.bindValue(":id", id); query.exec(); query.first(); return query.value(0).toBool(); } void DatabaseManager::dropTables() { query.exec("DROP TABLE IF EXISTS colnod_token, colnod_subject, colnod_subject_attribute"); } void DatabaseManager::createTables() { query.exec("CREATE TABLE colnod_subject (" "id CHAR(36) primary key," "name VARCHAR(255)," "last_update timestamp)"); query.exec("CREATE TABLE colnod_token (" "id CHAR(36) primary key," "token_data VARCHAR(255)," "subject_id CHAR(36)," "last_update timestamp)"); query.exec("CREATE TABLE colnod_subject_attribute (" "id VARCHAR(255) primary key," "attribute_key VARCHAR(255)," "attribute_value VARCHAR(255)," "subject_id CHAR(36))"); query.exec("CREATE TABLE users (" "id VARCHAR(255) primary key," "email VARCHAR(255)," "token_data VARCHAR(255)," "last_update timestamp)"); } uint64_t DatabaseManager::getLastUpdate() { query.exec("SELECT EXTRACT(EPOCH FROM (SELECT MIN(last_sync) FROM changes))*1000"); //MAX for using, MIN for testing query.next(); return query.value(0).toULongLong(); } void DatabaseManager::makeTestingLast_sync() { query.prepare("INSERT INTO last_changes (last_sync) " "VALUES (:time)"); query.bindValue(":time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")); query.exec(); } void DatabaseManager::updateLastSync() { query.prepare("INSERT INTO changes (last_sync) " "VALUES (:time)"); query.bindValue(":time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")); query.exec(); } QSqlQuery* DatabaseManager::getTokensToAdd() { QSqlQuery* qry = new QSqlQuery; qry->exec("SELECT name, token_data FROM changes WHERE status = 'toBeAdd'"); return qry; } QSqlQuery* DatabaseManager::getTokensToDelete() { QSqlQuery* qry = new QSqlQuery; qry->exec("SELECT id FROM changes WHERE status = 'toBeDeleted'"); return qry; } QUuid DatabaseManager::getId(QString name) { query.prepare("SELECT id FROM colnod_subject WHERE name = :name"); query.bindValue(":name", name); query.exec(); query.next(); return query.value(0).toUuid(); }