RemoteBackend::RemoteBackend(const std::string &suffix)
{
setArgPrefix("remote"+suffix);
- build(getArg("connection-string"));
+
+ this->d_connstr = getArg("connection-string");
this->d_result = NULL;
this->d_dnssec = mustDo("dnssec");
this->d_index = -1;
this->d_trxid = 0;
+
+ build();
}
RemoteBackend::~RemoteBackend() {
}
}
+bool RemoteBackend::send(rapidjson::Document &value) {
+ bool result = false;
+ try {
+ result = connector->send(value);
+ } catch (AhuException &ex) {
+ L<<Logger::Error<<"Exception caught when sending: " << ex.reason;
+ delete this->connector;
+ build();
+ } catch (...) {
+ L<<Logger::Error<<"Exception caught when sending";
+ delete this->connector;
+ build();
+ }
+ return result;
+}
+
+bool RemoteBackend::recv(rapidjson::Document &value) {
+ bool result = false;
+ try {
+ result = connector->recv(value);
+ } catch (AhuException &ex) {
+ L<<Logger::Error<<"Exception caught when receiving: " << ex.reason;
+ delete this->connector;
+ build();
+ } catch (...) {
+ L<<Logger::Error<<"Exception caught when receiving";
+ delete this->connector;
+ build();
+ }
+ return result;
+}
+
+
/**
* Builds connector based on options
* Currently supports unix,pipe and http
*/
-int RemoteBackend::build(const std::string &connstr) {
+int RemoteBackend::build() {
std::vector<std::string> parts;
std::string type;
std::string opts;
// connstr is of format "type:options"
size_t pos;
- pos = connstr.find_first_of(":");
+ pos = d_connstr.find_first_of(":");
if (pos == std::string::npos)
throw AhuException("Invalid connection string: malformed");
- type = connstr.substr(0, pos);
- opts = connstr.substr(pos+1);
+ type = d_connstr.substr(0, pos);
+ opts = d_connstr.substr(pos+1);
// tokenize the string on comma
stringtok(parts, opts, ",");
d_result = new rapidjson::Document();
- if (connector->send(query) == false || connector->recv(*d_result) == false) {
+ if (this->send(query) == false || this->recv(*d_result) == false) {
delete d_result;
return;
}
d_result = new rapidjson::Document();
- if (connector->send(query) == false || connector->recv(*d_result) == false) {
+ if (this->send(query) == false || this->recv(*d_result) == false) {
delete d_result;
return false;
}
JSON_ADD_MEMBER(parameters, "qname", qname.c_str(), query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
unhashed = getString(answer["result"]["unhashed"]);
JSON_ADD_MEMBER(parameters, "kind", kind.c_str(), query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false)
+ if (this->send(query) == false)
return false;
meta.clear();
// not mandatory to implement
- if (connector->recv(answer) == false)
+ if (this->recv(answer) == false)
return true;
if (answer["result"].IsArray()) {
parameters.AddMember("value", val, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return getBool(answer["result"]);
JSON_ADD_MEMBER(parameters, "kind", kind, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
keys.clear();
JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
parameters.AddMember("key", jkey, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return getInt(answer["result"]);
JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
JSON_ADD_MEMBER(parameters, "id", id, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
JSON_ADD_MEMBER(parameters, "name", name.c_str(), query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
if (algorithm != NULL)
JSON_ADD_MEMBER(parameters, "name", domain.c_str(), query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
// make sure we got zone & kind
JSON_ADD_MEMBER(parameters, "serial", serial, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false) {
+ if (this->send(query) == false || this->recv(answer) == false) {
L<<Logger::Error<<kBackendId<<"Failed to execute RPC for RemoteBackend::setNotified("<<id<<","<<serial<<")"<<endl;
}
}
*ddb = 0;
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
// we are the backend
JSON_ADD_MEMBER(parameters, "account", account.c_str(), query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
}
parameters.AddMember("rrset", rj_rrset, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true; // XXX FIXME this API should not return 'true' I think -ahu
}
parameters.AddMember("nonterm", nts, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
}
parameters.AddMember("nonterm", nts, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
}
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false) {
+ if (this->send(query) == false || this->recv(answer) == false) {
d_trxid = -1;
return false;
}
query.AddMember("parameters", parameters, query.GetAllocator());
d_trxid = -1;
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
}
query.AddMember("parameters", parameters, query.GetAllocator());
d_trxid = -1;
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
return true;
}
parameters.AddMember("sd", soadata, query.GetAllocator());
query.AddMember("parameters", parameters, query.GetAllocator());
- if (connector->send(query) == false || connector->recv(answer) == false)
+ if (this->send(query) == false || this->recv(answer) == false)
return false;
serial = getInt64(answer["result"]);