[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