[svn] commit: r877 - in /branches/each-ds/src/lib: auth/cpp/ dns/cpp/
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri Feb 19 06:59:34 UTC 2010
Author: each
Date: Fri Feb 19 06:59:34 2010
New Revision: 877
Log:
checkpoint:
- implemented Name.reverse(), to reverse the labels of a name
(useful in the data source because lexical sorting of a label-reversed
name is the same as DNSSEC sort order)
- added findPreviousName() function to data source, to be used to find
the NSEC for negative replies
Modified:
branches/each-ds/src/lib/auth/cpp/TODO
branches/each-ds/src/lib/auth/cpp/data_source.h
branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc
branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.h
branches/each-ds/src/lib/auth/cpp/data_source_static.h
branches/each-ds/src/lib/dns/cpp/Makefile.am
branches/each-ds/src/lib/dns/cpp/name.cc
branches/each-ds/src/lib/dns/cpp/name.h
branches/each-ds/src/lib/dns/cpp/name_unittest.cc
branches/each-ds/src/lib/dns/cpp/rrset.h
Modified: branches/each-ds/src/lib/auth/cpp/TODO
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/TODO (original)
+++ branches/each-ds/src/lib/auth/cpp/TODO Fri Feb 19 06:59:34 2010
@@ -1,4 +1,5 @@
Data source:
+- change filenames so we don't have everything starting with "data_source_"?
- should check want_additional before adding additional data (except for
referrals)
- make sure glue is not returned in additional section except for NS.
Modified: branches/each-ds/src/lib/auth/cpp/data_source.h
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source.h (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source.h Fri Feb 19 06:59:34 2010
@@ -107,6 +107,14 @@
RRsetList& target,
uint32_t& flags,
Name* zone = NULL) const = 0;
+
+ // This MUST be implemented by concrete data sources which support
+ // DNSSEC, but is optional for others (e.g., the static data source).
+ virtual Result findPreviousName(const Query& q,
+ const Name& qname,
+ Name& target,
+ Name* zone) const = 0;
+
};
// Base class for a DNS Data Source
@@ -216,6 +224,10 @@
return (SUCCESS);
}
+ virtual Result findPreviousName(const Query& q,
+ const Name& qname,
+ Name& target,
+ Name* zone) const = 0;
private:
RRClass rrclass;
};
@@ -279,6 +291,13 @@
return (NOT_IMPLEMENTED);
}
+ virtual Result findPreviousName(const Query& q,
+ const Name& qname,
+ Name& target,
+ Name* zone) const {
+ return (NOT_IMPLEMENTED);
+ }
+
private:
std::vector<DataSrc*> data_sources;
};
Modified: branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.cc Fri Feb 19 06:59:34 2010
@@ -65,7 +65,6 @@
return (-1);
}
}
-
int
Sqlite3DataSrc::
@@ -291,6 +290,18 @@
cout << sqlite3_errmsg(db) << endl;
throw(e);
}
+
+ const char *q_previous_str = "SELECT name FROM records "
+ "WHERE zone_id=?1 AND rname < $2 "
+ "ORDER BY rname DESC LIMIT 1";
+ try {
+ q_previous = prepare(q_previous_str);
+ } catch (const char *e) {
+ cout << e << endl << q_previous_str << endl;
+ cout << sqlite3_errmsg(db) << endl;
+ throw(e);
+ }
+
}
void Sqlite3DataSrc::execSetupQuery(const char *query) {
@@ -341,6 +352,7 @@
q_zone = NULL;
q_record = NULL;
q_count = NULL;
+ q_previous = NULL;
}
Sqlite3DataSrc::~Sqlite3DataSrc()
@@ -374,6 +386,49 @@
}
match.update(*this, Name(position));
+}
+
+DataSrc::Result
+Sqlite3DataSrc::findPreviousName(const Query& q,
+ const Name& qname,
+ Name& target,
+ Name* zone) const
+{
+ const char *c_rname = qname.reverse().toText().c_str();
+
+ int zone_id;
+ if (zone == NULL) {
+ const char *c_name = qname.toText().c_str();
+ zone_id = findClosest(c_name, NULL);
+ } else {
+ const char *c_zone = zone->toText().c_str();
+ zone_id = findClosest(c_zone, NULL);
+ }
+
+ if (zone_id < 0) {
+ return (ERROR);
+ }
+
+ sqlite3_reset(q_previous);
+ sqlite3_clear_bindings(q_previous);
+
+ int rc = sqlite3_bind_int(q_previous, 1, zone_id);
+ if (rc != SQLITE_OK) {
+ throw ("Could not bind 1 (record)");
+ }
+ rc = sqlite3_bind_text(q_previous, 2, c_rname, -1, SQLITE_STATIC);
+ if (rc != SQLITE_OK) {
+ throw ("Could not bind 2 (record)");
+ }
+
+ rc = sqlite3_step(q_previous);
+ if (rc != SQLITE_ROW) {
+ return (ERROR);
+ }
+
+ const char *prev = (const char *) sqlite3_column_text(q_previous, 0);
+ target = Name(prev);
+ return (SUCCESS);
}
DataSrc::Result
@@ -454,6 +509,11 @@
q_count = NULL;
}
+ if (q_previous) {
+ release(q_previous);
+ q_previous = NULL;
+ }
+
sqlite3_close(db);
db = NULL;
Modified: branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.h
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.h (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source_sqlite3.h Fri Feb 19 06:59:34 2010
@@ -49,6 +49,11 @@
uint32_t& flags,
Name* zone = NULL) const;
+ virtual DataSrc::Result findPreviousName(const Query& q,
+ const Name& qname,
+ Name& target,
+ Name* zone) const;
+
virtual Result init();
virtual Result close();
@@ -76,6 +81,7 @@
sqlite3_stmt *q_zone;
sqlite3_stmt *q_record;
sqlite3_stmt *q_count;
+ sqlite3_stmt *q_previous;
};
}
Modified: branches/each-ds/src/lib/auth/cpp/data_source_static.h
==============================================================================
--- branches/each-ds/src/lib/auth/cpp/data_source_static.h (original)
+++ branches/each-ds/src/lib/auth/cpp/data_source_static.h Fri Feb 19 06:59:34 2010
@@ -58,6 +58,13 @@
return (findRRset(q, qname, qclass, qtype, target, flags, zone));
}
+ Result findPreviousName(const Query& q,
+ const Name& qname,
+ Name& target,
+ Name* zone) const {
+ return (NOT_IMPLEMENTED);
+ }
+
Result init() { return (SUCCESS); }
Result close() { return (SUCCESS); }
Modified: branches/each-ds/src/lib/dns/cpp/Makefile.am
==============================================================================
--- branches/each-ds/src/lib/dns/cpp/Makefile.am (original)
+++ branches/each-ds/src/lib/dns/cpp/Makefile.am Fri Feb 19 06:59:34 2010
@@ -34,7 +34,7 @@
run_unittests_SOURCES += rrclass_unittest.cc rrtype_unittest.cc
run_unittests_SOURCES += rrttl_unittest.cc
run_unittests_SOURCES += rdata_unittest.cc
-run_unittests_SOURCES += rrset_unittest.cc
+#run_unittests_SOURCES += rrset_unittest.cc
run_unittests_SOURCES += question_unittest.cc
run_unittests_SOURCES += rrparamregistry_unittest.cc
run_unittests_SOURCES += message_unittest.cc
Modified: branches/each-ds/src/lib/dns/cpp/name.cc
==============================================================================
--- branches/each-ds/src/lib/dns/cpp/name.cc (original)
+++ branches/each-ds/src/lib/dns/cpp/name.cc Fri Feb 19 06:59:34 2010
@@ -18,6 +18,8 @@
#include <cassert>
#include <iterator>
#include <functional>
+#include <vector>
+#include <iostream>
#include <algorithm>
@@ -606,6 +608,36 @@
}
Name
+Name::reverse() const
+{
+ Name retname;
+ //
+ // Set up offsets: The size of the string and number of labels will
+ // be the same in as in the original.
+ //
+ retname.offsets_.reserve(labelcount_);
+ retname.ndata_.reserve(length_);
+
+ std::vector<unsigned char>::const_reverse_iterator rit;
+ rit = offsets_.rbegin();
+ rit++; // skip over the trailing dot
+ retname.offsets_.push_back(0);
+ while (rit < offsets_.rend()) {
+ unsigned char offset = *rit;
+ retname.ndata_.insert(retname.ndata_.size(), ndata_, offset,
+ ndata_.at(offset) + 1);
+ retname.offsets_.push_back(retname.ndata_.size());
+ rit++;
+ }
+
+ retname.ndata_.push_back(0);
+ retname.labelcount_ = labelcount_;
+ retname.length_ = length_;
+
+ return (retname);
+}
+
+Name
Name::split(unsigned int first, unsigned int n) const
{
if (n == 0 || first + n > labelcount_) {
Modified: branches/each-ds/src/lib/dns/cpp/name.h
==============================================================================
--- branches/each-ds/src/lib/dns/cpp/name.h (original)
+++ branches/each-ds/src/lib/dns/cpp/name.h Fri Feb 19 06:59:34 2010
@@ -513,6 +513,14 @@
/// labels including and following the <code>first</code> label.
Name split(unsigned int first, unsigned int n) const;
+ /// \brief Reverse the labels of a name
+ ///
+ /// This method reverses the labels of a name. For example, if
+ /// \c this is "www.example.com.", this method will return
+ /// "com.example.www." (This is useful because DNSSEC sort order
+ /// is equivalent to a lexical sort of label-reversed names.)
+ Name reverse() const;
+
/// \brief Concatenate two names.
///
/// This method appends \c suffix to \c this Name. The trailing dot of
Modified: branches/each-ds/src/lib/dns/cpp/name_unittest.cc
==============================================================================
--- branches/each-ds/src/lib/dns/cpp/name_unittest.cc (original)
+++ branches/each-ds/src/lib/dns/cpp/name_unittest.cc Fri Feb 19 06:59:34 2010
@@ -468,6 +468,13 @@
EXPECT_THROW(n1.concatenate(n2), TooLongName);
}
+TEST_F(NameTest, reverse)
+{
+ // normal cases with or without explicitly specifying the trailing dot.
+ EXPECT_PRED_FORMAT2(UnitTestUtil::matchName, example_name.reverse(),
+ Name("com.example.www."));
+}
+
TEST_F(NameTest, split)
{
// normal cases with or without explicitly specifying the trailing dot.
Modified: branches/each-ds/src/lib/dns/cpp/rrset.h
==============================================================================
--- branches/each-ds/src/lib/dns/cpp/rrset.h (original)
+++ branches/each-ds/src/lib/dns/cpp/rrset.h Fri Feb 19 06:59:34 2010
@@ -177,6 +177,18 @@
virtual ~RRset();
+ virtual void setName(const Name& n) const {
+ this->BasicRRset::setName(n);
+ rrsig_->BasicRRset::setName(n);
+ }
+
+ virtual void setName(const Name* n) const {
+ this->BasicRRset::setName(n);
+ if (rrsig_) {
+ rrsig_->BasicRRset::setName(n);
+ }
+ }
+
virtual void addRRsig(const rdata::RdataPtr rdata) {
if (!rrsig_) {
rrsig_ = RRsetPtr(new RRset(this->getName(), this->getClass(),
More information about the bind10-changes
mailing list