From 8aa786fa51dbbd9c82ec20f10892295c93c4054c Mon Sep 17 00:00:00 2001 From: ondra Date: Thu, 10 Dec 2020 19:13:36 +0100 Subject: [PATCH] Migration to mysql and update request auth --- .gitignore | 2 +- src/serversdk/databasemanager.cpp | 28 ++++++++++++++++++++++++++-- src/serversdk/databasemanager.h | 1 + src/serversdk/databasetable.cpp | 1 + src/serversdk/request.cpp | 8 ++++++++ src/serversdk/request.h | 8 ++++++++ src/serversdk/requestmanager.cpp | 21 ++++++++++++++++++--- src/serversdk/requestmanager.h | 2 ++ 8 files changed, 65 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index e41db47..7017a29 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,7 @@ __pycache__ # Python *.pyc -# CMake +# cmake *.txt.user *.txt.user.* diff --git a/src/serversdk/databasemanager.cpp b/src/serversdk/databasemanager.cpp index fe73963..f8ad759 100644 --- a/src/serversdk/databasemanager.cpp +++ b/src/serversdk/databasemanager.cpp @@ -63,6 +63,30 @@ bool DatabaseManager::openPostgres(const QString &host, const QString &dbName, c return res; } + bool DatabaseManager::openMysql(const QString &host, const QString &dbName, const QString &user, const QString &password, const QString &connectionName) + { + Q_ASSERT_X(mConnectionName.isEmpty(), "open postgres", "Expecting only one database per DatabaseManager"); + mConnectionName = connectionName; + mDatabase = QSqlDatabase::addDatabase("QMYSQL", mConnectionName); + + mDatabase.setDatabaseName(dbName); + mDatabase.setHostName(host); + mDatabase.setUserName(user); + // Froward testing -->> + mDatabase.setPort(3308); + mDatabase.setPassword(password); + // @see https://www.qtcentre.org/threads/39913-QSqlDatabase-connection-timeout + + int res = mDatabase.open(); + + if (!res) { + qInfo(sdkdb) << "Not possible to open database from url:" << host; + qInfo(sdkdb) << "Error:" << mDatabase.lastError().text(); + + } + return res; + } + bool DatabaseManager::isValid() const { @@ -93,10 +117,10 @@ QSqlQuery DatabaseManager::executeQuery(QSqlQuery &query, const QString &sqlText // isSelect is needed for correct bahaviour of 'dryMode' only select should be executed QString sqlStatement = sqlText; bool isSelect = false; - if ( sqlText.isEmpty()) { + if ( sqlStatement.isEmpty()) { sqlStatement = getLastQuery(query); } - if (sqlText.startsWith("SELECT", Qt::CaseInsensitive)) { + if (sqlStatement.startsWith("SELECT", Qt::CaseInsensitive)) { isSelect = true; } diff --git a/src/serversdk/databasemanager.h b/src/serversdk/databasemanager.h index 277fc03..7f2fc9f 100644 --- a/src/serversdk/databasemanager.h +++ b/src/serversdk/databasemanager.h @@ -27,6 +27,7 @@ public: bool openSQLite(const QString &path, const QString &connectionName = QStringLiteral("qt_sql_default_connection")); bool openPostgres(const QString& host, const QString& dbName, const QString& user, const QString& password, const QString &connectionName = QStringLiteral("qt_sql_default_connection")); + bool openMysql(const QString &host, const QString &dbName, const QString &user, const QString &password, const QString &connectionName = QStringLiteral("qt_sql_default_connection")); bool isValid() const; bool isOpen() const; void close(); diff --git a/src/serversdk/databasetable.cpp b/src/serversdk/databasetable.cpp index 27679a7..49fbc13 100644 --- a/src/serversdk/databasetable.cpp +++ b/src/serversdk/databasetable.cpp @@ -35,6 +35,7 @@ QByteArray DatabaseTable::jsonData(const QSet &filters) const bool DatabaseTable::fromJson(const QByteArray &data) { // in: JSON ( e.g. {"id": 300} ) + qDebug(sdkdb) << "Response:" << data; QJsonDocument doc = QJsonDocument::fromJson(data); QVariantMap variant = qvariant_cast(doc.toVariant()); diff --git a/src/serversdk/request.cpp b/src/serversdk/request.cpp index 101a9d2..c146946 100644 --- a/src/serversdk/request.cpp +++ b/src/serversdk/request.cpp @@ -160,9 +160,17 @@ qint64 Request::getProcessTime() return -1; } + +void Request::addHeader(const QString &name, const QString &value) +{ + header.insert(name, value); +} + } // core + + QDebug operator <<(QDebug dbg, serversdk::Request *request) { dbg.noquote() << request->type() << request->url() << "data:" << request->requestData() << "header:" << request->networkReply()->rawHeaderList(); diff --git a/src/serversdk/request.h b/src/serversdk/request.h index 5e9c5e1..20aa9b8 100644 --- a/src/serversdk/request.h +++ b/src/serversdk/request.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace serversdk { @@ -26,6 +27,7 @@ public: void setRequestData(const QByteArray &requestData); QByteArray responseData() const; + // Attributes QString url() const; void setUrl(const QString &url); @@ -46,6 +48,10 @@ public: qint64 getProcessTime(); + QMap getHeaders() { return header;} + void addHeader(const QString &name, const QString &value); + + private: // Additional attributes @@ -72,6 +78,8 @@ private: QByteArray mRequestData; QByteArray mResponseData; + QMap header; + // Additional attributes QDateTime mStartTime; QDateTime mFinishTime; diff --git a/src/serversdk/requestmanager.cpp b/src/serversdk/requestmanager.cpp index 24c9377..3502e67 100644 --- a/src/serversdk/requestmanager.cpp +++ b/src/serversdk/requestmanager.cpp @@ -32,24 +32,37 @@ bool RequestManager::processRequest(const std::shared_ptr& request) QNetworkReply *reply = nullptr; request->logStartTime(); + auto req = request->networkRequest(); + if (!request->getHeaders().empty()) { + auto headers = request->getHeaders(); + auto keys = headers.keys(); + foreach (auto key, keys) { + req.setRawHeader(key.toLocal8Bit(), headers.value(key).toLocal8Bit()); + } + } + if (request->type() == "POST") { if ( request->requestData().isEmpty()) { qCWarning(sdknetwork) << "Request data is empty -> nothing to send"; } - reply = mNetworkAccessManager.post(request->networkRequest(), request->requestData()); + reply = mNetworkAccessManager.post(req, request->requestData()); } else if (request->type() == "GET") { if ( ! request->requestData().isEmpty()) { qCWarning(sdknetwork) << "Request data is not empty, and you are trying to use get ( not sending any data)"; } - reply = mNetworkAccessManager.get(request->networkRequest()); + reply = mNetworkAccessManager.get(req); } else if (request->type() == "PUT") { - reply = mNetworkAccessManager.put(request->networkRequest(), request->requestData()); + reply = mNetworkAccessManager.put(req, request->requestData()); } else { qCritical(sdknetwork) << "Using request type:" << request->type() << "is not implemented"; return false; } + foreach (auto header, reply->request().rawHeaderList()) { + qDebug(sdknetwork) << header << ":" << reply->request().rawHeader(header); + } + Q_ASSERT(reply); // Adding reply to final request reply->setParent(nullptr); // ensure QNetworkreply wont be deleted by QNetworkAccessManager ( it is parent of reply ) @@ -112,6 +125,8 @@ void RequestManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) } QByteArray data = reply->readAll(); + qDebug(sdknetwork) << data; + // Decompress gzip data #ifdef CORESDK_ZLIB if (encoding.toLower() == "gzip" && !data.isEmpty() ) { diff --git a/src/serversdk/requestmanager.h b/src/serversdk/requestmanager.h index f8f2665..323c872 100644 --- a/src/serversdk/requestmanager.h +++ b/src/serversdk/requestmanager.h @@ -40,4 +40,6 @@ private: bool mIgnoreSsl = false; }; + + } // core