Heart/ClientProtocol/sqldbwriter.cpp

306 lines
7.5 KiB
C++
Raw Normal View History

2019-10-26 20:53:47 +03:00
#include "dbtablebase.h"
2019-10-22 17:59:56 +03:00
#include "sqldbwriter.h"
#include <QRegularExpression>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <quasarapp.h>
#include <clientprotocol.h>
2019-10-22 21:51:21 +03:00
#include <QJsonDocument>
#include <QJsonObject>
2019-10-26 20:53:47 +03:00
#include <QHash>
#include <dbobject.h>
2019-10-27 11:39:15 +03:00
#include <QSqlRecord>
2019-10-22 21:51:21 +03:00
namespace ClientProtocol {
2019-10-22 17:59:56 +03:00
2019-10-26 20:53:47 +03:00
QString SqlDBWriter::tablesListMySql() {
return "show tables";
}
QString SqlDBWriter::tablesListSqlite() {
return "SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%'";
}
QString SqlDBWriter::describeQueryMySql(const QString &tabme) {
return QString("describe %0").arg(tabme);
}
QString SqlDBWriter::describeQuerySqlite(const QString &tabme) {
return QString("pragma table_info('%0')").arg(tabme);
}
QString SqlDBWriter::getTablesQuery() {
auto driver = _config["DBDriver"].toString();
if (driver.contains("QSQLITE")) {
return tablesListSqlite();
} else if (driver.contains("QMYSQL")) {
return tablesListMySql();
}
return "";
}
QString SqlDBWriter::describeQuery(const QString &tabme) {
auto driver = _config["DBDriver"].toString();
if (driver.contains("QSQLITE")) {
return describeQuerySqlite(tabme);
} else if (driver.contains("QMYSQL")) {
return describeQueryMySql(tabme);
}
return "";
}
2019-10-22 17:59:56 +03:00
bool SqlDBWriter::exec(QSqlQuery *sq,const QString& sqlFile) {
QFile f(sqlFile);
bool result = true;
if (f.open(QIODevice::ReadOnly)) {
QString temp, delimiter = ";";
QTextStream stream(&f);
stream.setCodec("UTF8");
while(!stream.atEnd()) {
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
temp += stream.readLine();
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
if (temp.lastIndexOf("delimiter", -1, Qt::CaseInsensitive) > -1) {
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
temp.remove("delimiter", Qt::CaseInsensitive);
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
int last = temp.indexOf(QRegularExpression("[^ \f\n\r\t\v]")) + 1;
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
int begin = temp.lastIndexOf(QRegularExpression("[^ \f\n\r\t\v]"));
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
delimiter = temp.mid(begin, last - begin);
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
temp = "";
} else {
if (temp.lastIndexOf(delimiter) >- 1) {
temp.remove(delimiter);
2019-10-25 18:18:28 +03:00
2019-10-22 17:59:56 +03:00
result = result && sq->exec(temp);
if (!result) {
2019-10-26 20:53:47 +03:00
QuasarAppUtils::Params::verboseLog("exec database error: " +sq->lastError().text(),
QuasarAppUtils::Error);
2019-10-22 17:59:56 +03:00
f.close();
return false;
}
temp = "";
}
}
}
f.close();
2019-10-26 20:53:47 +03:00
if (result && !(sq->prepare(getTablesQuery()) && sq->exec())) {
QuasarAppUtils::Params::verboseLog("init database error: " +sq->lastError().text(),
QuasarAppUtils::Error);
}
QStringList tables;
while(sq->next()) {
tables.push_back(sq->value(0).toString());
}
for(auto &table : tables) {
if (!(sq->prepare(describeQuery(table)) && sq->exec())) {
QuasarAppUtils::Params::verboseLog("init database error: " +sq->lastError().text(),
QuasarAppUtils::Error);
continue;
}
DbTableBase tableInfo{table, {}};
while (sq->next()) {
tableInfo.keys[sq->value(0).toString()] = getType(sq->value(1).toString());
}
_dbStruct[table] = tableInfo;
}
2019-10-22 17:59:56 +03:00
return result;
}
return false;
}
2019-10-22 21:51:21 +03:00
bool SqlDBWriter::enableFK() {
2019-10-22 17:59:56 +03:00
QString request = QString("PRAGMA foreign_keys = ON");
2019-10-22 21:51:21 +03:00
if (!query.exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query.lastError().text());
2019-10-22 17:59:56 +03:00
return false;
}
return true;
}
2019-10-22 21:51:21 +03:00
bool SqlDBWriter::disableFK() {
2019-10-22 17:59:56 +03:00
QString request = QString("PRAGMA foreign_keys = OFF");
2019-10-22 21:51:21 +03:00
if (!query.exec(request)) {
QuasarAppUtils::Params::verboseLog("request error : " + query.lastError().text());
2019-10-22 17:59:56 +03:00
return false;
}
return true;
}
2019-10-22 21:51:21 +03:00
QVariantMap SqlDBWriter::getInitParams(const QString &initFile) const {
QFile file(initFile);
QVariantMap res;
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
if (file.open(QIODevice::ReadOnly)) {
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
file.close();
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
if (!doc.isObject()) {
return res;
}
QJsonObject obj = doc.object();
return obj.toVariantMap();
2019-10-22 17:59:56 +03:00
}
return res;
}
2019-10-22 21:51:21 +03:00
/*
* about driver see https://doc.qt.io/qt-5/sql-driver.html
*/
QVariantMap SqlDBWriter::defaultInitPararm() const {
QVariantMap params;
params["DBDriver"] = "QSQLITE";
params["DBFile"] = DEFAULT_DB_PATH;
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
return params;
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
SqlDBWriter::SqlDBWriter() {
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
bool SqlDBWriter::initDb(const QString &initDbParams) {
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
QVariantMap params;
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
if (initDbParams.isEmpty()) {
params = defaultInitPararm();
} else {
params = getInitParams(initDbParams);
2019-10-22 17:59:56 +03:00
}
2019-10-26 20:53:47 +03:00
_config = params;
2019-10-22 21:51:21 +03:00
db = QSqlDatabase::addDatabase(params["DBDriver"].toString(),
QFileInfo(params["DBFilePath"].toString()).fileName());
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
if (params.contains("DBFilePath")) {
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
auto path = QFileInfo(params["DBFilePath"].toString()).absoluteFilePath();
if (!QDir("").mkpath(path)) {
2019-10-22 17:59:56 +03:00
return false;
}
2019-10-22 21:51:21 +03:00
db.setDatabaseName(path);
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
if (params.contains("DBLogin")) {
db.setPassword(params["DBLogin"].toString());
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
if (params.contains("DBPass")) {
db.setPassword(params["DBPass"].toString());
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
if (params.contains("DBHost")) {
db.setHostName(params["DBHost"].toString());
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
if (params.contains("DBPort")) {
db.setPort(params["DBPort"].toInt());
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
query = QSqlQuery(db);
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
if (!db.open()) {
2019-10-22 17:59:56 +03:00
return false;
}
2019-10-22 21:51:21 +03:00
if (params.contains("DBInitFile")) {
auto path = QFileInfo(params["DBInitFile"].toString()).absoluteFilePath();
2019-10-22 17:59:56 +03:00
2019-10-22 21:51:21 +03:00
if (!exec(&query, path)) {
return false;
}
2019-10-22 17:59:56 +03:00
}
2019-10-22 21:51:21 +03:00
initSuccessful = db.isValid();
2019-10-22 17:59:56 +03:00
return initSuccessful;
}
bool SqlDBWriter::isValid() const {
2019-10-22 21:51:21 +03:00
return db.isValid() && db.isOpen() && initSuccessful;
2019-10-22 17:59:56 +03:00
}
2019-10-26 20:53:47 +03:00
bool SqlDBWriter::getObject(DBObject *result, const QString& table, int id) const {
2019-10-27 11:39:15 +03:00
if (!_dbStruct.contains(table)) {
2019-10-26 20:53:47 +03:00
return false;
}
2019-10-27 11:39:15 +03:00
QSqlQuery q(db);
result->clear();
result->setTableStruct(_dbStruct.value(table));
result->setId(id);
return result->getSelectQueryString(&q);
2019-10-26 20:53:47 +03:00
}
bool SqlDBWriter::saveObject(DBObject *saveObject) {
}
bool SqlDBWriter::deleteObject(const QString& table, int id) {
}
2019-10-22 17:59:56 +03:00
SqlDBWriter::~SqlDBWriter() {
2019-10-22 21:51:21 +03:00
}
2019-10-22 17:59:56 +03:00
2019-10-25 18:18:28 +03:00
#define c(x) str.contains(x, Qt::CaseInsensitive)
QVariant::Type SqlDBWriter::getType(const QString &str) {
if (str.isEmpty() || c(" BINARY") || c(" BLOB") || c(" TINYBLOB") || c(" MEDIUMBLOB") || c(" LONGBLOB")) {
return QVariant::ByteArray;
} else if (c(" INT")) {
return QVariant::Int;
} else if (c(" VARCHAR") || c(" TEXT") || c(" TINYTEXT") || c(" MEDIUMTEXT") || c(" LONGTEXT")) {
return QVariant::String;
} else if (c(" FLOAT") || c(" DOUBLE") || c(" REAL")) {
return QVariant::Double;
} else if (c(" BOOL")) {
return QVariant::Bool;
} else if (c(" DATETIME")) {
return QVariant::DateTime;
} else if (c(" DATE")) {
return QVariant::Date;
} else if (c(" TIME")) {
return QVariant::Time;
}
return QVariant::ByteArray;
}
2019-10-22 17:59:56 +03:00
}