[svn] commit: r2533 - in /branches/trac232/src: bin/auth/auth_srv.cc lib/datasrc/data_source.cc lib/datasrc/data_source.h lib/datasrc/sqlite3_datasrc.cc lib/datasrc/sqlite3_datasrc.h lib/datasrc/tests/sqlite3_unittest.cc
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Jul 19 14:46:14 UTC 2010
Author: jelte
Date: Mon Jul 19 14:46:14 2010
New Revision: 2533
Log:
removed sqlite3 specific calls from doIXFR and moved it up to data_source.h
also a bit of general cleanup
Modified:
branches/trac232/src/bin/auth/auth_srv.cc
branches/trac232/src/lib/datasrc/data_source.cc
branches/trac232/src/lib/datasrc/data_source.h
branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
branches/trac232/src/lib/datasrc/sqlite3_datasrc.h
branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc
Modified: branches/trac232/src/bin/auth/auth_srv.cc
==============================================================================
--- branches/trac232/src/bin/auth/auth_srv.cc (original)
+++ branches/trac232/src/bin/auth/auth_srv.cc Mon Jul 19 14:46:14 2010
@@ -364,7 +364,7 @@
RRTTL(args->get("rr_ttl")->stringValue())));
RdataPtr rdata = createRdata(rrset->getType(), rrset->getClass(), args->get("rr_rdata")->stringValue());
rrset->addRdata(rdata);
- DataSrcTransaction transaction(datasource, zone_name);
+ DataSrcTransaction transaction(datasource, zone_name, RRClass::IN());
DataSrc::Result r = datasource->startTransaction(transaction);
if (r != DataSrc::SUCCESS) {
return isc::config::createAnswer(r, "error starting transaction");
@@ -414,7 +414,7 @@
rrset->addRdata(rdata);
}
}
- DataSrcTransaction transaction(datasource, zone_name);
+ DataSrcTransaction transaction(datasource, zone_name, RRClass::IN());
DataSrc::Result r = datasource->startTransaction(transaction);
if (r != DataSrc::SUCCESS) {
return isc::config::createAnswer(r, "error starting transaction");
@@ -501,7 +501,7 @@
DataSrc* datasource = const_cast<DataSrc*>(match.getDataSource());
// hmz can't we assign RRTypes?
if (datasource) {
- DataSrcTransaction transaction(datasource, zone_name);
+ DataSrcTransaction transaction(datasource, zone_name, RRClass::IN());
DataSrc::Result r = datasource->startTransaction(transaction);
if (r != DataSrc::SUCCESS) {
return isc::config::createAnswer(r, "error starting transaction");
@@ -588,7 +588,7 @@
impl_->data_sources_.findClosestEnclosure(match);
DataSrc* datasource = const_cast<DataSrc*>(match.getDataSource());
if (datasource) {
- DataSrcTransaction transaction(datasource, zone_name);
+ DataSrcTransaction transaction(datasource, zone_name, RRClass::IN());
DataSrc::Result result = datasource->startTransaction(transaction);
if (result != DataSrc::SUCCESS) {
return isc::config::createAnswer(result, "error starting transaction");
Modified: branches/trac232/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.cc (original)
+++ branches/trac232/src/lib/datasrc/data_source.cc Mon Jul 19 14:46:14 2010
@@ -1246,52 +1246,96 @@
//
DataSrc::Result
DataSrc::init(const isc::data::ElementPtr config UNUSED_PARAM) {
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::startTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::commitTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::rollbackTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::addRRset(DataSrcTransaction& transaction UNUSED_PARAM,
const isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::delRRset(DataSrcTransaction& transaction UNUSED_PARAM,
isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::delZone(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
DataSrc::replaceZone(DataSrcTransaction& transaction UNUSED_PARAM,
- RRsetList& rrsets UNUSED_PARAM)
-{
- return NOT_IMPLEMENTED;
+ const RRsetList& UNUSED_PARAM)
+{
+ return (NOT_IMPLEMENTED);
+}
+
+static bool
+equalRRsets(ConstRRsetPtr a, ConstRRsetPtr b) {
+ if (a->getName() != b->getName() ||
+ a->getClass() != b->getClass() ||
+ a->getType() != b->getType() ||
+ a->getRdataCount() != b->getRdataCount()) {
+ return (false);
+ }
+ RdataIteratorPtr ita = a->getRdataIterator();
+ RdataIteratorPtr itb = b->getRdataIterator();
+ itb->first();
+ for (ita->first(); !ita->isLast(); ita->next()) {
+ if (ita->getCurrent().compare(itb->getCurrent()) != 0) {
+ return (false);
+ }
+ itb->next();
+ }
+ return (true);
+}
+
+bool
+DataSrc::haveRRset(DataSrcTransaction& transaction UNUSED_PARAM,
+ ConstRRsetPtr rrset) {
+ RRsetList rrset_list;
+ DataSrc::Result result;
+ uint32_t flags = 0;
+
+ if (rrset->getClass() == RRClass::ANY() || rrset->getClass() == RRClass::NONE()) {
+ result = findExactRRset(rrset->getName(), RRClass::IN(),
+ rrset->getType(), rrset_list, flags, NULL);
+ } else {
+ result = findExactRRset(rrset->getName(), rrset->getClass(),
+ rrset->getType(), rrset_list, flags, NULL);
+ }
+ if (result != DataSrc::SUCCESS || rrset_list.size() == 0) {
+ return (false);
+ }
+ if (rrset->getRdataCount() > 0) {
+ return (equalRRsets(rrset, *(rrset_list.begin())));
+ } else {
+ return ((*(rrset_list.begin()))->getRdataCount() > 0);
+ }
}
DataSrc::Result
@@ -1299,7 +1343,74 @@
const isc::dns::RRsetIterator start UNUSED_PARAM,
const isc::dns::RRsetIterator end UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ if (transaction.getState() != DataSrcTransaction::RUNNING) {
+ return (DataSrc::ERROR);
+ }
+
+ RRsetIterator rrsets = start;
+ RRsetPtr final_soa = *rrsets;
+ rrsets++;
+ RRsetPtr first_soa = *rrsets;
+ rrsets++;
+ if (first_soa->getType() == RRType::SOA()) {
+ if (!haveRRset(transaction, first_soa)) {
+ std::cout << "[XX] Start SOA does not match mine: " << first_soa->toText() << std::endl;
+ return (DataSrc::ERROR);
+ }
+ } else {
+ // Not a SOA, then this must be an AXFR-type response
+ //int zone_id = transaction.getData()->get("zone_id")->intValue();
+ //delAll(zone_id);
+ RRsetList empty_list;
+ replaceZone(transaction, empty_list);
+
+ while (rrsets != end) {
+ addRRset(transaction, *rrsets++);
+ }
+ return (DataSrc::SUCCESS);
+ }
+ bool deleting = true;
+
+ std::cout << "[XX] final soa: " << final_soa->toText() << std::endl;
+ RRsetPtr cur_rrset;
+ while (rrsets != end) {
+ cur_rrset = *rrsets;
+ std::cout << "[XX] cur rrset: " << cur_rrset->toText() << std::endl;
+
+ // If we see a SOA, it means we are switching operations (either
+ // we start deleting or adding depending on what we were doing
+ // before.
+ // We don't delete the actual SOA itself,
+ if (cur_rrset->getType() == RRType::SOA()) {
+ // TODO: check if serial has increased compared to the last soa we saw
+ deleting = !deleting;
+ } else {
+ if (deleting) {
+ // check if rrset exists, if not, something is very wrong, abort
+ if (haveRRset(transaction, cur_rrset)) {
+ std::cout << "[XX] delete: " << cur_rrset->toText() << std::endl;
+ delRRset(transaction, cur_rrset);
+ } else {
+ std::cout << "[XX] rrset for delete not found: " << cur_rrset->toText() << std::endl;
+ return (DataSrc::ERROR);
+ }
+ } else {
+ std::cout << "[XX] add: " << cur_rrset->toText() << std::endl;
+ addRRset(transaction, cur_rrset);
+ }
+ }
+ rrsets++;
+ }
+ if (equalRRsets(cur_rrset, final_soa)) {
+ // Finally replace the SOA
+ delRRset(transaction, first_soa);
+ addRRset(transaction, final_soa);
+ return (DataSrc::SUCCESS);
+ } else {
+ std::cout << "[XX] something went wrong" << std::endl;
+ return (DataSrc::ERROR);
+ }
+ return (NOT_IMPLEMENTED);
}
@@ -1375,47 +1486,47 @@
DataSrc::Result
MetaDataSrc::startTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
MetaDataSrc::commitTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
MetaDataSrc::rollbackTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
MetaDataSrc::addRRset(DataSrcTransaction& transaction UNUSED_PARAM,
isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
MetaDataSrc::delRRset(DataSrcTransaction& transaction UNUSED_PARAM,
isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
MetaDataSrc::delZone(DataSrcTransaction& transaction UNUSED_PARAM)
{
- return NOT_IMPLEMENTED;
+ return (NOT_IMPLEMENTED);
}
DataSrc::Result
MetaDataSrc::replaceZone(DataSrcTransaction& transaction UNUSED_PARAM,
- RRsetList& rrsets UNUSED_PARAM)
-{
- return NOT_IMPLEMENTED;
-}
-
-}
-}
+ const isc::dns::RRsetList& rrset_list UNUSED_PARAM)
+{
+ return (NOT_IMPLEMENTED);
+}
+
+}
+}
Modified: branches/trac232/src/lib/datasrc/data_source.h
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.h (original)
+++ branches/trac232/src/lib/datasrc/data_source.h Mon Jul 19 14:46:14 2010
@@ -185,12 +185,13 @@
_data_source(data_source),
_state(INIT) {};
~DataSrcTransaction();
- states getState() { return _state; };
+ states getState() { return (_state); };
void setState(states state) { _state = state; };
- isc::data::ElementPtr getData() { return _data; };
+ isc::data::ElementPtr getData() { return (_data); };
void setData(isc::data::ElementPtr data) { _data = data; };
- const isc::dns::Name getZoneName() { return _zone_name; };
- const isc::dns::RRClass getZoneClass() { return _zone_class; };
+ const isc::dns::Name getZoneName() { return (_zone_name); };
+ const isc::dns::RRClass getZoneClass() { return (_zone_class); };
+ DataSrc* getDataSource() { return (_data_source); };
private:
isc::data::ElementPtr _data;
@@ -225,9 +226,9 @@
void setClass(isc::dns::RRClass& c) { rrclass = c; }
void setClass(const isc::dns::RRClass& c) { rrclass = c; }
- Result init() { return NOT_IMPLEMENTED; }
+ Result init() { return (NOT_IMPLEMENTED); }
Result init(const isc::data::ElementPtr config);
- Result close() { return NOT_IMPLEMENTED; }
+ Result close() { return (NOT_IMPLEMENTED); }
virtual Result findRRset(const isc::dns::Name& qname,
const isc::dns::RRClass& qclass,
@@ -273,7 +274,9 @@
isc::dns::ConstRRsetPtr rrset);
virtual Result delZone(DataSrcTransaction& transaction);
virtual Result replaceZone(DataSrcTransaction& transaction,
- isc::dns::RRsetList& rrsets);
+ const isc::dns::RRsetList& rrsets);
+ virtual bool haveRRset(DataSrcTransaction& transaction,
+ isc::dns::ConstRRsetPtr rrset);
virtual Result startTransaction(DataSrcTransaction& transaction);
virtual Result commitTransaction(DataSrcTransaction& transaction);
virtual Result rollbackTransaction(DataSrcTransaction& transaction);
@@ -363,7 +366,7 @@
isc::dns::ConstRRsetPtr rrset);
virtual Result delZone(DataSrcTransaction& transaction);
virtual Result replaceZone(DataSrcTransaction& transaction,
- isc::dns::RRsetList& rrsets);
+ const isc::dns::RRsetList& rrsets);
// end of writable data sources part
private:
std::vector<ConstDataSrcPtr> data_sources;
Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc Mon Jul 19 14:46:14 2010
@@ -1077,7 +1077,7 @@
DataSrc::Result
Sqlite3DataSrc::replaceZone(DataSrcTransaction& transaction,
- isc::dns::RRsetList& rrsets)
+ const isc::dns::RRsetList& rrsets)
{
if (transaction.getState() != DataSrcTransaction::RUNNING) {
return DataSrc::ERROR;
@@ -1089,8 +1089,13 @@
if (result != DataSrc::SUCCESS) {
return result;
}
- BOOST_FOREACH(isc::dns::RRsetPtr rrset, rrsets) {
- addRRset(transaction, rrset);
+
+ RRsetList::const_iterator it = rrsets.begin();
+ while (it != rrsets.end()) {
+ result = addRRset(transaction, *it);
+ if (result != DataSrc::SUCCESS) {
+ return result;
+ }
}
return DataSrc::SUCCESS;
}
@@ -1171,135 +1176,6 @@
return result;
}
-static bool
-equalRRsets(const RRsetPtr& a, const RRsetPtr& b) {
- if (a->getName() != b->getName() ||
- a->getClass() != b->getClass() ||
- a->getType() != b->getType() ||
- a->getRdataCount() != b->getRdataCount()) {
- return false;
- }
- RdataIteratorPtr ita = a->getRdataIterator();
- RdataIteratorPtr itb = b->getRdataIterator();
- itb->first();
- for (ita->first(); !ita->isLast(); ita->next()) {
- if (ita->getCurrent().compare(itb->getCurrent()) != 0) {
- return false;
- }
- itb->next();
- }
- return true;
-}
-
-// should we have this as a convenience function in DataSrc?
-static bool
-haveRRset(const AbstractDataSrc *datasrc, const RRsetPtr rrset) {
- RRsetList rrset_list;
- DataSrc::Result result;
- uint32_t flags = 0;
-
- cout << "[XX] haveRRset called on " << rrset->toText() << endl;
-
- if (rrset->getClass() == RRClass::ANY() || rrset->getClass() == RRClass::NONE()) {
- result = datasrc->findExactRRset(rrset->getName(), RRClass::IN(),
- rrset->getType(), rrset_list, flags, NULL);
- } else {
- result = datasrc->findExactRRset(rrset->getName(), rrset->getClass(),
- rrset->getType(), rrset_list, flags, NULL);
- }
- if (result != DataSrc::SUCCESS || rrset_list.size() == 0) {
- cout << "[XX] findExact result not SUCCESS or rrset_list.size 0" << endl;
- cout << "[XX] size: " << rrset_list.size() << endl;
- cout << "[XX] returning false" << endl;
- return false;
- }
- if (rrset->getRdataCount() > 0) {
- cout << "[XX] checking for completely equal" << endl;
- cout << "[XX] want: " << rrset->toText() << endl;
- cout << "[XX] have: " << (*(rrset_list.begin()))->toText() << endl;
- cout << "[XX] returning: " << equalRRsets(rrset, *(rrset_list.begin())) << endl;
- return equalRRsets(rrset, *(rrset_list.begin()));
- } else {
- cout << "[XX] rdata count for match 0, so we found it" << endl;
- cout << "[XX] returning: " << ((*(rrset_list.begin()))->getRdataCount() > 0) << endl;
- return ((*(rrset_list.begin()))->getRdataCount() > 0);
- }
-}
-
-// TODO: this is a very general one, move to DataSrc?
-// also more specific return values on error
-DataSrc::Result
-Sqlite3DataSrc::doIXFR(DataSrcTransaction& transaction,
- const RRsetIterator start,
- const RRsetIterator end)
-{
- if (transaction.getState() != DataSrcTransaction::RUNNING) {
- return DataSrc::ERROR;
- }
-
- RRsetIterator rrsets = start;
- RRsetPtr final_soa = *rrsets;
- rrsets++;
- RRsetPtr first_soa = *rrsets;
- rrsets++;
- if (first_soa->getType() == RRType::SOA()) {
- if (!haveRRset(this, first_soa)) {
- std::cout << "[XX] Start SOA does not match mine: " << first_soa->toText() << std::endl;
- return DataSrc::ERROR;
- }
- } else {
- // Not a SOA, then this must be an AXFR-type response
- int zone_id = transaction.getData()->get("zone_id")->intValue();
- delAll(zone_id);
-
- while (rrsets != end) {
- addRRset(transaction, *rrsets++);
- }
- return DataSrc::SUCCESS;
- }
- bool deleting = true;
-
- std::cout << "[XX] final soa: " << final_soa->toText() << std::endl;
- RRsetPtr cur_rrset;
- while (rrsets != end) {
- cur_rrset = *rrsets;
- std::cout << "[XX] cur rrset: " << cur_rrset->toText() << std::endl;
-
- // If we see a SOA, it means we are switching operations (either
- // we start deleting or adding depending on what we were doing
- // before.
- // We don't delete the actual SOA itself,
- if (cur_rrset->getType() == RRType::SOA()) {
- // TODO: check if serial has increased compared to the last soa we saw
- deleting = !deleting;
- } else {
- if (deleting) {
- // check if rrset exists, if not, something is very wrong, abort
- if (haveRRset(this, cur_rrset)) {
- std::cout << "[XX] delete: " << cur_rrset->toText() << std::endl;
- delRRset(transaction, cur_rrset);
- } else {
- std::cout << "[XX] rrset for delete not found: " << cur_rrset->toText() << std::endl;
- return DataSrc::ERROR;
- }
- } else {
- std::cout << "[XX] add: " << cur_rrset->toText() << std::endl;
- addRRset(transaction, cur_rrset);
- }
- }
- rrsets++;
- }
- if (equalRRsets(cur_rrset, final_soa)) {
- // Finally replace the SOA
- delRRset(transaction, first_soa);
- addRRset(transaction, final_soa);
- return DataSrc::SUCCESS;
- } else {
- std::cout << "[XX] something went wrong" << std::endl;
- return DataSrc::ERROR;
- }
-}
-
isc::dns::Rcode
Sqlite3DataSrc::updateCheckPrerequisite(DataSrcTransaction& transaction, RRsetPtr prereq)
{
@@ -1311,10 +1187,10 @@
return Rcode::FORMERR();
}
if (prereq->getType() == RRType::ANY()) {
- if (!haveRRset(this, prereq)) {
+ if (!haveRRset(transaction, prereq)) {
return Rcode::NXDOMAIN();
}
- } else if (!haveRRset(this, prereq)) {
+ } else if (!haveRRset(transaction, prereq)) {
return Rcode::NXRRSET();
}
} else if (prereq->getClass() == RRClass::NONE()) {
@@ -1323,10 +1199,10 @@
return Rcode::FORMERR();
}
if (prereq->getType() == RRType::ANY()) {
- if (haveRRset(this, prereq)) {
+ if (haveRRset(transaction, prereq)) {
return Rcode::YXDOMAIN();
}
- } else if (haveRRset(this, prereq)) {
+ } else if (haveRRset(transaction, prereq)) {
return Rcode::YXRRSET();
}
} else if (prereq->getClass() == transaction.getZoneClass()) {
@@ -1334,7 +1210,7 @@
return Rcode::FORMERR();
}
// 3.2.3 talks about rebuilding sets, but we already have full rrsets
- if (!haveRRset(this, prereq)) {
+ if (!haveRRset(transaction, prereq)) {
return Rcode::NXRRSET();
}
} else {
Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.h
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.h (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.h Mon Jul 19 14:46:14 2010
@@ -119,11 +119,13 @@
DataSrc::Result delRRset(DataSrcTransaction& transaction,
isc::dns::ConstRRsetPtr rrset);
DataSrc::Result replaceZone(DataSrcTransaction& transaction,
- isc::dns::RRsetList& rrsets);
+ const isc::dns::RRsetList& rrset_list);
DataSrc::Result delZone(DataSrcTransaction& transaction);
+/*
DataSrc::Result doIXFR(DataSrcTransaction& transaction,
const isc::dns::RRsetIterator start,
const isc::dns::RRsetIterator end);
+*/
DataSrc::Result doUpdate(DataSrcTransaction& transaction,
isc::dns::Message& msg);
Modified: branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc (original)
+++ branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc Mon Jul 19 14:46:14 2010
@@ -980,6 +980,7 @@
data_source.rollbackTransaction(transaction));
EXPECT_EQ(DataSrc::ERROR,
data_source.addRRset(transaction, new_rrset));
+ RRsetIterator rrset_it = RRsetIterator();
RRsetList empty_list;
EXPECT_EQ(DataSrc::ERROR,
data_source.replaceZone(transaction, empty_list));
@@ -1117,12 +1118,12 @@
EXPECT_EQ(DataSrc::SUCCESS, find_flags);
EXPECT_EQ(1, result_sets.size());
- RRsetList new_list;
+ RRsetList empty_list;
// Replace them, roll back
DataSrcTransaction transaction1(&data_source, zone_name, RRClass::IN());
data_source.startTransaction(transaction1);
- data_source.replaceZone(transaction1, new_list);
+ data_source.replaceZone(transaction1, empty_list);
data_source.rollbackTransaction(transaction1);
// check whether it still exists
@@ -1135,7 +1136,7 @@
// Replace them, commit
DataSrcTransaction transaction2(&data_source, zone_name, RRClass::IN());
data_source.startTransaction(transaction2);
- data_source.replaceZone(transaction2, new_list);
+ data_source.replaceZone(transaction2, empty_list);
data_source.commitTransaction(transaction2);
// check whether it's gone now
More information about the bind10-changes
mailing list