Commit 26c6fdf2 authored by JINMEI Tatuya's avatar JINMEI Tatuya
Browse files

sync with trunk


git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac411@3598 e5f2f494-b856-4b98-b285-d166d9295462
parents e0dcd56b 9afb5766
118. [func] jinmei
src/lib/dns: changed the interface of AbstractRRset::getRdataIterator()
so that the internal cursor would point to the first RDATA
automatically. This will be a more intuitive and less error prone
behavior. This is a backward compatible change. (Trac #410, r3595)
117. [func] jinmei
src/lib/datasrc: added new zone and zone table classes for the
support of in memory data source. This is an intermediate step to
the bigger feature, and is not yet actually usable in practice.
(Trac #399, svn r3590)
116. [bug] jerry
src/bin/xfrout: Xfrout and Auth will communicate by long tcp
connection, Auth needs to make a new connection only on the first
......
......@@ -131,7 +131,7 @@ host_lookup(const char* const name, const char* const type) {
}
RdataIteratorPtr rit = (*it)->getRdataIterator();
for (rit->first(); !rit->isLast(); rit->next()) {
for (; !rit->isLast(); rit->next()) {
// instead of using my name, maybe use returned label?
cout << name << " has address " <<
(*rit).getCurrent().toText() << endl;
......
......@@ -15,3 +15,4 @@ libdatasrc_la_SOURCES += static_datasrc.h static_datasrc.cc
libdatasrc_la_SOURCES += sqlite3_datasrc.h sqlite3_datasrc.cc
libdatasrc_la_SOURCES += query.h query.cc
libdatasrc_la_SOURCES += cache.h cache.cc
libdatasrc_la_SOURCES += zonetable.h zonetable.cc
......@@ -170,9 +170,9 @@ public:
/// then promoted to the head of the LRU queue. (NOTE: Because
/// of this, "retrieve" cannot be implemented as a const method.)
///
/// \param name The query name
/// \param rrclass The query class
/// \param rrtype The query type
/// \param qname The query name
/// \param qclass The query class
/// \param qtype The query type
/// \param rrset Returns the RRset found, if any, to the caller
/// \param flags Returns the flags, if any, to the caller
///
......
......@@ -95,7 +95,7 @@ getAdditional(Query& q, ConstRRsetPtr rrset) {
}
RdataIteratorPtr it = rrset->getRdataIterator();
for (it->first(); !it->isLast(); it->next()) {
for (; !it->isLast(); it->next()) {
const Rdata& rd(it->getCurrent());
if (rrset->getType() == RRType::NS()) {
const generic::NS& ns = dynamic_cast<const generic::NS&>(rd);
......@@ -123,7 +123,6 @@ synthesizeCname(QueryTaskPtr task, RRsetPtr rrset, RRsetList& target) {
// More than one DNAME RR in the RRset is illegal, so we only have
// to process the first one.
it->first();
if (it->isLast()) {
return;
}
......@@ -152,7 +151,6 @@ chaseCname(Query& q, QueryTaskPtr task, RRsetPtr rrset) {
// More than one CNAME RR in the RRset is illegal, so we only have
// to process the first one.
it->first();
if (it->isLast()) {
return;
}
......@@ -660,7 +658,6 @@ getNsec3Param(Query& q, ZoneInfo& zoneinfo) {
// XXX: currently only one NSEC3 chain per zone is supported;
// we will need to revisit this.
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
if (it->isLast()) {
return (ConstNsec3ParamPtr());
}
......
......@@ -24,6 +24,7 @@ run_unittests_SOURCES += static_unittest.cc
run_unittests_SOURCES += query_unittest.cc
run_unittests_SOURCES += cache_unittest.cc
run_unittests_SOURCES += test_datasrc.h test_datasrc.cc
run_unittests_SOURCES += zonetable_unittest.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
run_unittests_LDADD = $(GTEST_LDADD)
......
......@@ -124,7 +124,6 @@ DataSrcTest::QueryCommon(const RRClass& qclass) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -138,7 +137,6 @@ DataSrcTest::QueryCommon(const RRClass& qclass) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -154,7 +152,6 @@ DataSrcTest::QueryCommon(const RRClass& qclass) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -193,7 +190,6 @@ TEST_F(DataSrcTest, NSQuery) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -216,7 +212,6 @@ TEST_F(DataSrcTest, DuplicateQuery) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -237,7 +232,6 @@ TEST_F(DataSrcTest, DuplicateQuery) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -334,7 +328,6 @@ TEST_F(DataSrcTest, Wildcard) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -353,7 +346,6 @@ TEST_F(DataSrcTest, Wildcard) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -369,7 +361,6 @@ TEST_F(DataSrcTest, Wildcard) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -406,7 +397,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -419,7 +409,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -438,7 +427,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -454,7 +442,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -474,7 +461,6 @@ TEST_F(DataSrcTest, WildcardCnameNodata) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -506,7 +492,6 @@ TEST_F(DataSrcTest, WildcardCnameNxdomain) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("spork.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -544,7 +529,6 @@ TEST_F(DataSrcTest, AuthDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -556,7 +540,6 @@ TEST_F(DataSrcTest, AuthDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -572,7 +555,6 @@ TEST_F(DataSrcTest, AuthDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -591,7 +573,6 @@ TEST_F(DataSrcTest, Dname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("sql1.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -605,7 +586,6 @@ TEST_F(DataSrcTest, Dname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -621,7 +601,6 @@ TEST_F(DataSrcTest, Dname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -649,7 +628,6 @@ TEST_F(DataSrcTest, Cname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("cnametest.flame.org.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -668,7 +646,6 @@ TEST_F(DataSrcTest, CnameInt) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -695,7 +672,6 @@ TEST_F(DataSrcTest, CnameExt) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.sql1.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -720,7 +696,6 @@ TEST_F(DataSrcTest, Delegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
......@@ -732,7 +707,6 @@ TEST_F(DataSrcTest, Delegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -751,7 +725,6 @@ TEST_F(DataSrcTest, NSDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
......@@ -763,7 +736,6 @@ TEST_F(DataSrcTest, NSDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -795,7 +767,6 @@ TEST_F(DataSrcTest, NSECZonecut) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -817,7 +788,6 @@ TEST_F(DataSrcTest, DNAMEZonecut) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
......@@ -829,7 +799,6 @@ TEST_F(DataSrcTest, DNAMEZonecut) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -854,7 +823,6 @@ TEST_F(DataSrcTest, DS) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -890,7 +858,6 @@ TEST_F(DataSrcTest, NSECZonecutOfNonsecureZone) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ(createRdata(RRType::NS(), RRClass::IN(),
"ns.sub.example.org.")->toText(),
it->getCurrent().toText());
......@@ -904,7 +871,6 @@ TEST_F(DataSrcTest, NSECZonecutOfNonsecureZone) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ(createRdata(RRType::A(), RRClass::IN(), "192.0.2.101")->toText(),
it->getCurrent().toText());
it->next();
......
......@@ -244,7 +244,6 @@ checkRRset(RRsetPtr rrset, const Name& expected_name,
EXPECT_EQ(expected_rrttl, rrset->getTTL());
RdataIteratorPtr rdata_iterator = rrset->getRdataIterator();
rdata_iterator->first();
vector<string>::const_iterator data_it = expected_data.begin();
for (; data_it != expected_data.end(); ++data_it) {
EXPECT_FALSE(rdata_iterator->isLast());
......
......@@ -109,7 +109,6 @@ checkRRset(ConstRRsetPtr rrset, const Name& expected_name,
EXPECT_EQ(rrttl, rrset->getTTL());
RdataIteratorPtr rdata_iterator = rrset->getRdataIterator();
rdata_iterator->first();
vector<string>::const_iterator data_it = expected_data.begin();
for (; data_it != expected_data.end(); ++data_it) {
EXPECT_FALSE(rdata_iterator->isLast());
......
......@@ -408,7 +408,7 @@ copyRRset(RRsetPtr const source) {
RRsetPtr rrset = RRsetPtr(new RRset(source->getName(), source->getClass(),
source->getType(), source->getTTL()));
RdataIteratorPtr it = source->getRdataIterator();
for (it->first(); !it->isLast(); it->next()) {
for (; !it->isLast(); it->next()) {
rrset->addRdata(it->getCurrent());
}
if (source->getRRsig()) {
......
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include <exceptions/exceptions.h>
#include <dns/name.h>
#include <dns/rrclass.h>
#include <datasrc/zonetable.h>
#include <gtest/gtest.h>
using namespace isc::dns;
using namespace isc::datasrc;
namespace {
TEST(ZoneTest, init) {
Zone zone(RRClass::IN(), Name("example.com"));
EXPECT_EQ(Name("example.com"), zone.getOrigin());
EXPECT_EQ(RRClass::IN(), zone.getClass());
Zone ch_zone(RRClass::CH(), Name("example"));
EXPECT_EQ(Name("example"), ch_zone.getOrigin());
EXPECT_EQ(RRClass::CH(), ch_zone.getClass());
}
class ZoneTableTest : public ::testing::Test {
protected:
ZoneTableTest() : zone1(new Zone(RRClass::IN(), Name("example.com"))),
zone2(new Zone(RRClass::IN(), Name("example.net"))),
zone3(new Zone(RRClass::IN(), Name("example")))
{}
ZoneTable zone_table;
ZonePtr zone1, zone2, zone3;
};
TEST_F(ZoneTableTest, add) {
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone1));
EXPECT_EQ(ZoneTable::EXIST, zone_table.add(zone1));
// names are compared in a case insensitive manner.
EXPECT_EQ(ZoneTable::EXIST, zone_table.add(
ZonePtr(new Zone(RRClass::IN(), Name("EXAMPLE.COM")))));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone2));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone3));
// Zone table is indexed only by name. Duplicate origin name with
// different zone class isn't allowed.
EXPECT_EQ(ZoneTable::EXIST, zone_table.add(
ZonePtr(new Zone(RRClass::CH(), Name("example.com")))));
/// Bogus zone (NULL)
EXPECT_THROW(zone_table.add(ZonePtr()), isc::InvalidParameter);
}
TEST_F(ZoneTableTest, remove) {
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone1));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone2));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone3));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.remove(Name("example.net")));
EXPECT_EQ(ZoneTable::NOTFOUND, zone_table.remove(Name("example.net")));
}
TEST_F(ZoneTableTest, find) {
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone1));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone2));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone3));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.find(Name("example.com")).code);
EXPECT_EQ(Name("example.com"),
zone_table.find(Name("example.com")).zone->getOrigin());
EXPECT_EQ(ZoneTable::NOTFOUND,
zone_table.find(Name("example.org")).code);
EXPECT_EQ(static_cast<const Zone*>(NULL),
zone_table.find(Name("example.org")).zone);
// there's no exact match. the result should be the longest match,
// and the code should be PARTIALMATCH.
EXPECT_EQ(ZoneTable::PARTIALMATCH,
zone_table.find(Name("www.example.com")).code);
EXPECT_EQ(Name("example.com"),
zone_table.find(Name("www.example.com")).zone->getOrigin());
// make sure the partial match is indeed the longest match by adding
// a zone with a shorter origin and query again.
ZonePtr zone_com(new Zone(RRClass::IN(), Name("com")));
EXPECT_EQ(ZoneTable::SUCCESS, zone_table.add(zone_com));
EXPECT_EQ(Name("example.com"),
zone_table.find(Name("www.example.com")).zone->getOrigin());
}
}
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
// Note: map and utility (for 'pair') are for temporary workaround.
// we'll soon replace them with built-in intelligent backend structure.
#include <map>
#include <utility>
#include <dns/name.h>
#include <dns/rrclass.h>
#include <datasrc/zonetable.h>
using namespace std;
using namespace isc::dns;
namespace isc {
namespace datasrc {
struct Zone::ZoneImpl {
ZoneImpl(const RRClass& zone_class, const Name& origin) :
zone_class_(zone_class), origin_(origin)
{}
RRClass zone_class_;
Name origin_;
};
Zone::Zone(const RRClass& zone_class, const Name& origin) : impl_(NULL) {
impl_ = new ZoneImpl(zone_class, origin);
}
Zone::~Zone() {
delete impl_;
}
const Name&
Zone::getOrigin() const {
return (impl_->origin_);
}
const RRClass&
Zone::getClass() const {
return (impl_->zone_class_);
}
// This is a temporary, inefficient implementation using std::map and handmade
// iteration to realize longest match.
struct ZoneTable::ZoneTableImpl {
typedef map<Name, ZonePtr> ZoneMap;
typedef pair<Name, ZonePtr> NameAndZone;
ZoneMap zones;
};
ZoneTable::ZoneTable() : impl_(new ZoneTableImpl)
{}
ZoneTable::~ZoneTable() {
delete impl_;
}
ZoneTable::Result
ZoneTable::add(ZonePtr zone) {
if (!zone) {
isc_throw(InvalidParameter,
"Null pointer is passed to ZoneTable::add()");
}
if (impl_->zones.insert(
ZoneTableImpl::NameAndZone(zone->getOrigin(), zone)).second
== true) {
return (SUCCESS);
} else {
return (EXIST);
}
}
ZoneTable::Result
ZoneTable::remove(const Name& origin) {
return (impl_->zones.erase(origin) == 1 ? SUCCESS : NOTFOUND);
}
ZoneTable::FindResult
ZoneTable::find(const Name& name) const {
// Inefficient internal loop to find a longest match.
// This will be replaced with a single call to more intelligent backend.
for (int i = 0; i < name.getLabelCount(); ++i) {
Name matchname(name.split(i));
ZoneTableImpl::ZoneMap::const_iterator found =
impl_->zones.find(matchname);
if (found != impl_->zones.end()) {
return (FindResult(i == 0 ? SUCCESS : PARTIALMATCH,
(*found).second.get()));
}
}
return (FindResult(NOTFOUND, NULL));
}
} // end of namespace datasrc
} // end of namespace isc
// Copyright (C) 2010 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#ifndef __ZONETABLE_H
#define __ZONETABLE_H 1
#include <boost/shared_ptr.hpp>
namespace isc {
namespace dns {