[svn] commit: r671 - in /experiments/each-query/src/lib/auth/cpp: data_source.cc data_source.h query.h
BIND 10 source code commits
bind10-changes at lists.isc.org
Sat Jan 30 00:13:16 UTC 2010
Author: each
Date: Sat Jan 30 00:13:16 2010
New Revision: 671
Log:
checkpoint
Modified:
experiments/each-query/src/lib/auth/cpp/data_source.cc
experiments/each-query/src/lib/auth/cpp/data_source.h
experiments/each-query/src/lib/auth/cpp/query.h
Modified: experiments/each-query/src/lib/auth/cpp/data_source.cc
==============================================================================
--- experiments/each-query/src/lib/auth/cpp/data_source.cc (original)
+++ experiments/each-query/src/lib/auth/cpp/data_source.cc Sat Jan 30 00:13:16 2010
@@ -12,7 +12,101 @@
DSResult
DataSrc::runQuery(Query q) {
- return SUCCESS;
+ DSResult result;
+ RRsetList data, sigs;
+ Name container(".");
+ Message& m = q.message();
+
+ while (!q.tasks().empty()) {
+ QueryTaskPtr task = q.tasks().front();
+ q.tasks().pop();
+
+ const DataSrc* ds = findClosestEnclosure(task->qname, container);
+
+ if (ds == NULL) {
+ result = ZONE_NOT_FOUND;
+ } else if (q.wantDnssec()) {
+ result = ds->findRRset(task->qname, task->qclass, task->qtype,
+ data, sigs);
+ // XXX validity check:
+ // for now, there must only be exactly one RRset in data
+ // and no more than one RRset in sigs. the rrtype of data
+ // must match the sigtype of sigs, if any
+ } else {
+ result = ds->findRRset(task->qname, task->qclass, task->qtype,
+ data);
+ }
+
+ switch (result) {
+ case SUCCESS:
+ m.addRRset(task->section, data[0]);
+ if (q.wantDnssec() && sigs.size() == 1) {
+ m.addRRset(Section(task->section), sigs[0]);
+ }
+
+ if (q.status() == QUERY_FINISHING) {
+ q.setStatus(QUERY_DONE);
+ return (SUCCESS);
+ }
+
+ // if there are no more work items, add the authority section
+ if (q.tasks().empty() && q.status() == QUERY_INCOMPLETE) {
+ QueryTask *qt = new QueryTask(container, task->qclass,
+ RRType::NS(),
+ Section::AUTHORITY());
+ q.tasks().push(QueryTaskPtr(qt));
+ q.setStatus(QUERY_FINISHING);
+ }
+ continue;
+
+ case CNAME:
+ m.addRRset(task->section, data[0]);
+ if (q.wantDnssec() && sigs.size() == 1) {
+ m.addRRset(Section(task->section), sigs[0]);
+ }
+ // take apart the CNAME rdata and re-query HERE
+ continue;
+
+ case NAME_NOT_FOUND:
+ q.setStatus(QUERY_NODATA);
+ if (q.wantDnssec()) {
+ result = ds->findRRset(container, task->qclass,
+ RRType::SOA(), data, sigs);
+ } else {
+ result = ds->findRRset(container, task->qclass,
+ RRType::SOA(), data);
+ }
+
+ if (result != SUCCESS) {
+ m.setRcode(Rcode::SERVFAIL());
+ return (ERROR);
+ }
+
+ m.setRcode(Rcode::NXDOMAIN());
+ m.addRRset(Section::AUTHORITY(), data[0]);
+ if (q.wantDnssec() && sigs.size() == 1) {
+ m.addRRset(Section::AUTHORITY(), sigs[0]);
+ }
+ break;
+
+ case TYPE_NOT_FOUND:
+ m.setRcode(Rcode::NOERROR());
+ q.setStatus(QUERY_NODATA);
+ return (result);
+
+ case ZONE_NOT_FOUND:
+ m.setRcode(Rcode::REFUSED());
+ q.setStatus(QUERY_NODATA);
+ return (result);
+
+ default:
+ m.setRcode(Rcode::SERVFAIL());
+ q.setStatus(QUERY_NODATA);
+ return (result);
+ }
+ }
+
+ return (result);
};
Modified: experiments/each-query/src/lib/auth/cpp/data_source.h
==============================================================================
--- experiments/each-query/src/lib/auth/cpp/data_source.h (original)
+++ experiments/each-query/src/lib/auth/cpp/data_source.h Sat Jan 30 00:13:16 2010
@@ -29,8 +29,10 @@
SUCCESS,
NOT_IMPLEMENTED,
ERROR,
+ CNAME,
ZONE_NOT_FOUND,
- NAME_NOT_FOUND
+ NAME_NOT_FOUND,
+ TYPE_NOT_FOUND
};
class DataSrc;
Modified: experiments/each-query/src/lib/auth/cpp/query.h
==============================================================================
--- experiments/each-query/src/lib/auth/cpp/query.h (original)
+++ experiments/each-query/src/lib/auth/cpp/query.h Sat Jan 30 00:13:16 2010
@@ -31,7 +31,8 @@
enum QueryStatus {
QUERY_INCOMPLETE,
- QUERY_FOUND,
+ QUERY_FINISHING,
+ QUERY_DONE,
QUERY_NODATA
};
@@ -47,21 +48,19 @@
// An individual task to be carried out by the query logic
class QueryTask {
public:
- QueryTask(const Name& n, const RRClass& c, const RRType& t, SectionCode s) :
- qname(n), qclass(c), qtype(t)
- {
- section = s;
- }
-
+ QueryTask(const Name& n, const RRClass& c,
+ const RRType& t, const Section& s) :
+ qname(n), qclass(c), qtype(t), section(s) {}
virtual ~QueryTask();
const Name& qname;
const RRClass& qclass;
const RRType& qtype;
- SectionCode section;
+ const Section& section;
};
-typedef std::queue<QueryTask*> QueryTaskQueue;
+typedef boost::shared_ptr<QueryTask> QueryTaskPtr;
+typedef std::queue<QueryTaskPtr> QueryTaskQueue;
class Query;
typedef boost::shared_ptr<Query> QueryPtr;
@@ -86,8 +85,9 @@
qname_ = &query->getName();
qclass_ = &query->getClass();
qtype_ = &query->getType();
- querytasks.push(new QueryTask(*qname_, *qclass_, *qtype_,
- ANSWER_SECTION));
+ QueryTask *qt = new QueryTask(*qname_, *qclass_, *qtype_,
+ Section::ANSWER());
+ querytasks.push(QueryTaskPtr(qt));
};
virtual ~Query() {}
@@ -110,7 +110,7 @@
Message& message() { return *message_; }
QueryTaskQueue& tasks() { return querytasks; }
- QueryStatus result() { return status_; }
+ QueryStatus status() { return status_; }
void setStatus(QueryStatus s) { status_ = s; }
protected:
More information about the bind10-changes
mailing list