fix for query string keys without value, added required option to JSON

This commit is contained in:
john30
2015-06-07 18:39:40 +02:00
parent 96778e33fb
commit 137941982c
2 changed files with 41 additions and 21 deletions
+2 -1
View File
@@ -2,11 +2,12 @@
## Bug fixes ## Bug fixes
* fix for numeric parsing of empty string * fix for numeric parsing of empty string
* allow HTTP port query string keys without value
## Features ## Features
* new "read" option "-n" for retrieving name/value pairs in numeric form * new "read" option "-n" for retrieving name/value pairs in numeric form
* new "find" option "-e" for exactly matching name and optional circuit (ignoring case) * new "find" option "-e" for exactly matching name and optional circuit (ignoring case)
* added numeric and verbose options to JSON and use "null" for unset or replacement value * added numeric, verbose, and required options to JSON and use "null" for unset or replacement value
* allow static ".json" files being served by HTTP port * allow static ".json" files being served by HTTP port
* allow passing raw value when writing name/value pairs * allow passing raw value when writing name/value pairs
Regular → Executable
+39 -20
View File
@@ -868,7 +868,7 @@ string MainLoop::executeHelp()
string MainLoop::executeGet(vector<string> &args, bool& connected) string MainLoop::executeGet(vector<string> &args, bool& connected)
{ {
result_t ret = RESULT_OK; result_t ret = RESULT_OK;
bool verbose = false, numeric = false; bool verbose = false, numeric = false, required = false;
size_t argPos = 1; size_t argPos = 1;
string uri = args[argPos++]; string uri = args[argPos++];
ostringstream result; ostringstream result;
@@ -891,23 +891,28 @@ string MainLoop::executeGet(vector<string> &args, bool& connected)
string token; string token;
while (getline(stream, token, '&') != 0) { while (getline(stream, token, '&') != 0) {
pos = token.find('='); pos = token.find('=');
string qname, value;
if (pos != string::npos) { if (pos != string::npos) {
string qname = token.substr(0, pos); qname = token.substr(0, pos);
string value = token.substr(pos+1); value = token.substr(pos+1);
if (strcmp(qname.c_str(), "since") == 0) { } else {
since = parseInt(value.c_str(), 10, 0, 0xffffffff, ret); qname = token;
} else if (strcmp(qname.c_str(), "poll") == 0) {
pollPriority = (unsigned char)parseInt(value.c_str(), 10, 1, 9, ret);
} else if (strcmp(qname.c_str(), "exact") == 0) {
exact = value.length()==0 || strcmp(value.c_str(), "1") == 0;
} else if (strcmp(qname.c_str(), "verbose") == 0) {
verbose = value.length()==0 || strcmp(value.c_str(), "1") == 0;
} else if (strcmp(qname.c_str(), "numeric") == 0) {
numeric = value.length()==0 || strcmp(value.c_str(), "1") == 0;
}
if (ret != RESULT_OK)
break;
} }
if (strcmp(qname.c_str(), "since") == 0) {
since = parseInt(value.c_str(), 10, 0, 0xffffffff, ret);
} else if (strcmp(qname.c_str(), "poll") == 0) {
pollPriority = (unsigned char)parseInt(value.c_str(), 10, 1, 9, ret);
} else if (strcmp(qname.c_str(), "exact") == 0) {
exact = value.length()==0 || strcmp(value.c_str(), "1") == 0;
} else if (strcmp(qname.c_str(), "verbose") == 0) {
verbose = value.length()==0 || strcmp(value.c_str(), "1") == 0;
} else if (strcmp(qname.c_str(), "numeric") == 0) {
numeric = value.length()==0 || strcmp(value.c_str(), "1") == 0;
} else if (strcmp(qname.c_str(), "required") == 0) {
required = value.length()==0 || strcmp(value.c_str(), "1") == 0;
}
if (ret != RESULT_OK)
break;
} }
} }
deque<Message*> messages = m_messages->findAll(clazz, name, -1, exact, true, false, true); deque<Message*> messages = m_messages->findAll(clazz, name, -1, exact, true, false, true);
@@ -924,10 +929,24 @@ string MainLoop::executeGet(vector<string> &args, bool& connected)
if (pollPriority > 0 && message->setPollPriority(pollPriority)) if (pollPriority > 0 && message->setPollPriority(pollPriority))
m_messages->addPollMessage(message); m_messages->addPollMessage(message);
time_t lastup = message->getLastUpdateTime(); time_t lastup = message->getLastUpdateTime();
if (since > 0 && lastup <= since) if (lastup == 0 && required) {
continue; // read directly from bus
if (lastup > maxLastUp) SymbolString master(true);
maxLastUp = lastup; SymbolString slave(false);
result_t ret = readFromBus(message, master, "", slave);
if (ret == RESULT_OK) {
ostringstream temp;
ret = message->decode(pt_slaveData, slave, temp);
}
if (ret != RESULT_OK)
break;
lastup = message->getLastUpdateTime();
} else {
if (since > 0 && lastup <= since)
continue;
if (lastup > maxLastUp)
maxLastUp = lastup;
}
if (message->getCircuit() != lastCircuit) { if (message->getCircuit() != lastCircuit) {
if (lastCircuit.length() > 0) if (lastCircuit.length() > 0)
result << "\n },"; result << "\n },";