From fa40917053211bc2a2d60509028e83b029801475 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Tue, 8 Sep 2015 11:48:46 +0100 Subject: [PATCH] API Buffered Write .. when sending metrics, since if no selection is made it can result in thousands of needless updates ! --- httpserver/httpresponse.cpp | 21 +++++++++++++++++++++ httpserver/httpresponse.h | 7 +++++++ src/APIWebService.cpp | 20 ++++++++++---------- src/RideDB.y | 13 ++++++------- 4 files changed, 44 insertions(+), 17 deletions(-) diff --git a/httpserver/httpresponse.cpp b/httpserver/httpresponse.cpp index 542177011..597b65899 100644 --- a/httpserver/httpresponse.cpp +++ b/httpserver/httpresponse.cpp @@ -11,6 +11,8 @@ HttpResponse::HttpResponse(QTcpSocket* socket) { statusText="OK"; sentHeaders=false; sentLastPart=false; + buffersize=4096; + barry.reserve(4096); } void HttpResponse::setHeader(QByteArray name, QByteArray value) { @@ -72,6 +74,25 @@ bool HttpResponse::writeToSocket(QByteArray data) { return true; } +void HttpResponse::bwrite(QByteArray data) +{ + if (barry.size() && (barry.size() + data.size() > buffersize)) { + // flush buffer + write(barry); + barry = data; + } else { + barry.append(data); + } +} + +void HttpResponse::flush() +{ + if (barry.size()) { + write(barry, true); + barry.clear(); + } +} + void HttpResponse::write(QByteArray data, bool lastPart) { Q_ASSERT(sentLastPart==false); if (sentHeaders==false) { diff --git a/httpserver/httpresponse.h b/httpserver/httpresponse.h index 8c47af4d3..ccf0dcc31 100644 --- a/httpserver/httpresponse.h +++ b/httpserver/httpresponse.h @@ -85,6 +85,11 @@ public: */ void write(QByteArray data, bool lastPart=false); + // buffered write + void setBuffersize(int size) { buffersize=size; barry.reserve(size); } + void bwrite(QByteArray data); + void flush(); + /** Indicates wheter the body has been sent completely. Used by the connection handler to terminate the body automatically when necessary. @@ -136,6 +141,8 @@ private: */ void writeHeaders(); + int buffersize; + QByteArray barry; }; #endif // HTTPRESPONSE_H diff --git a/src/APIWebService.cpp b/src/APIWebService.cpp index fa241dd60..9aa3daf74 100644 --- a/src/APIWebService.cpp +++ b/src/APIWebService.cpp @@ -116,28 +116,28 @@ APIWebService::writeRideLine(QList wanted, RideItem &item, HttpRequest *req if (item.dateTime.date() < since) return; // date, time, filename - response->write(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit()); - response->write(","); - response->write(item.dateTime.time().toString("hh:mm:ss").toLocal8Bit());; - response->write(","); - response->write(item.fileName.toLocal8Bit()); + response->bwrite(item.dateTime.date().toString("yyyy/MM/dd").toLocal8Bit()); + response->bwrite(","); + response->bwrite(item.dateTime.time().toString("hh:mm:ss").toLocal8Bit());; + response->bwrite(","); + response->bwrite(item.fileName.toLocal8Bit()); if (wanted.count()) { // specific metrics foreach(int index, wanted) { double value = item.metrics()[index]; - response->write(","); - response->write(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + response->bwrite(","); + response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); } } else { // all metrics... foreach(double value, item.metrics()) { - response->write(","); - response->write(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); + response->bwrite(","); + response->bwrite(QString("%1").arg(value, 'f').simplified().toLocal8Bit()); } } - response->write("\n"); + response->bwrite("\n"); } void diff --git a/src/RideDB.y b/src/RideDB.y index 239ff4add..4460542f3 100644 --- a/src/RideDB.y +++ b/src/RideDB.y @@ -494,7 +494,7 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re if (metrics != "") wantedNames = metrics.split(","); // write headings - response.write("date, time, filename"); + response.bwrite("date, time, filename"); int i=0; foreach(const RideMetric *m, indexed) { @@ -506,16 +506,16 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re if (wantedNames.count() && !wantedNames.contains(underscored)) continue; if (m->name().startsWith("BikeScore")) - response.write(", BikeScore"); + response.bwrite(", BikeScore"); else { - response.write(", "); - response.write(underscored.toLocal8Bit()); + response.bwrite(", "); + response.bwrite(underscored.toLocal8Bit()); } // index of wanted metrics wanted << (i-1); } - response.write("\n"); + response.bwrite("\n"); // parse the rideDB and write a line for each entry QString ridedb = QString("%1/%2/cache/rideDB.json").arg(home.absolutePath()).arg(athlete); @@ -562,8 +562,7 @@ APIWebService::listRides(QString athlete, HttpRequest &request, HttpResponse &re // regardless of errors we're done ! delete jc; - - return; } + response.flush(); } #endif