mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
API Buffered Write
.. when sending metrics, since if no selection is made it can result in thousands of needless updates !
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -116,28 +116,28 @@ APIWebService::writeRideLine(QList<int> 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
|
||||
|
||||
13
src/RideDB.y
13
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
|
||||
|
||||
Reference in New Issue
Block a user