forked from ondra/colnod-connector
213 lines
7.3 KiB
C++
213 lines
7.3 KiB
C++
#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();
|
|
}
|