#include <dns/name.h>
#include <dns/rrclass.h>
-#include <datasrc/zonetable.h>
+#include <datasrc/result.h>
+#include <datasrc/memory/zone_data.h>
+#include <datasrc/memory/zone_table.h>
// We use InMemoryZone to put something into the table
#include <datasrc/memory_datasrc.h>
using namespace isc::dns;
using namespace isc::datasrc;
+using namespace isc::datasrc::memory;
namespace {
-TEST(ZoneTest, init) {
- InMemoryZoneFinder zone(RRClass::IN(), Name("example.com"));
- EXPECT_EQ(Name("example.com"), zone.getOrigin());
- EXPECT_EQ(RRClass::IN(), zone.getClass());
-
- InMemoryZoneFinder ch_zone(RRClass::CH(), Name("example"));
- EXPECT_EQ(Name("example"), ch_zone.getOrigin());
- EXPECT_EQ(RRClass::CH(), ch_zone.getClass());
-}
-
-TEST(ZoneTest, find) {
- InMemoryZoneFinder zone(RRClass::IN(), Name("example.com"));
- EXPECT_EQ(ZoneFinder::NXDOMAIN,
- zone.find(Name("www.example.com"), RRType::A())->code);
-}
-
class ZoneTableTest : public ::testing::Test {
protected:
- ZoneTableTest() : zone1(new InMemoryZoneFinder(RRClass::IN(),
- Name("example.com"))),
- zone2(new InMemoryZoneFinder(RRClass::IN(),
- Name("example.net"))),
- zone3(new InMemoryZoneFinder(RRClass::IN(),
- Name("example"))),
+ ZoneTableTest() : zname1(Name("example.com")),
+ zname2(Name("example.net")),
+ zname3(Name("example")),
+ zone1(new ZoneData(RRClass::IN(), zname1)),
+ zone2(new ZoneData(RRClass::IN(), zname2)),
+ zone3(new ZoneData(RRClass::IN(), zname3)),
zone_table(ZoneTable::create(mem_sgmt_))
{}
~ZoneTableTest() {
ZoneTable::destroy(mem_sgmt_, zone_table);
}
- ZoneFinderPtr zone1, zone2, zone3;
+ const Name zname1, zname2, zname3;
+ ZoneData* zone1;
+ ZoneData* zone2;
+ ZoneData* zone3;
isc::util::MemorySegmentLocal mem_sgmt_;
ZoneTable* zone_table;
};
TEST_F(ZoneTableTest, addZone) {
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone1));
- EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zone1));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1, zone1));
+ EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zname1, zone1));
// names are compared in a case insensitive manner.
EXPECT_EQ(result::EXIST, zone_table->addZone(
- mem_sgmt_,
- ZoneFinderPtr(new InMemoryZoneFinder(RRClass::IN(),
- Name("EXAMPLE.COM")))));
+ mem_sgmt_, Name("EXAMPLE.COM"),
+ new ZoneData(RRClass::IN(), Name("EXAMPLE.COM"))));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone2));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone3));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2, zone2));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3, zone3));
// Zone table is indexed only by name. Duplicate origin name with
// different zone class isn't allowed.
EXPECT_EQ(result::EXIST, zone_table->addZone(
- mem_sgmt_,
- ZoneFinderPtr(new InMemoryZoneFinder(RRClass::CH(),
- Name("example.com")))));
+ mem_sgmt_, Name("example.com"),
+ new ZoneData(RRClass::CH(), Name("example.com"))));
/// Bogus zone (NULL)
- EXPECT_THROW(zone_table->addZone(mem_sgmt_, ZoneFinderPtr()),
+ EXPECT_THROW(zone_table->addZone(mem_sgmt_, zname1, NULL),
isc::InvalidParameter);
}
TEST_F(ZoneTableTest, DISABLED_removeZone) {
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone1));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone2));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone3));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1, zone1));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2, zone2));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3, zone3));
EXPECT_EQ(result::SUCCESS, zone_table->removeZone(Name("example.net")));
EXPECT_EQ(result::NOTFOUND, zone_table->removeZone(Name("example.net")));
}
TEST_F(ZoneTableTest, findZone) {
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone1));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone2));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone3));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1, zone1));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2, zone2));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3, zone3));
EXPECT_EQ(result::SUCCESS, zone_table->findZone(Name("example.com")).code);
EXPECT_EQ(Name("example.com"),
// make sure the partial match is indeed the longest match by adding
// a zone with a shorter origin and query again.
- ZoneFinderPtr zone_com(new InMemoryZoneFinder(RRClass::IN(), Name("com")));
- EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zone_com));
+ EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_,
+ Name("com"),
+ new ZoneData(RRClass::IN(),
+ Name("com"))));
EXPECT_EQ(Name("example.com"),
zone_table->findZone(Name("www.example.com")).zone->getOrigin());
}
--- /dev/null
+// Copyright (C) 2012 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 DATASRC_MEMORY_ZONE_DATA_H
+#define DATASRC_MEMORY_ZONE_DATA_H 1
+
+#include <dns/name.h>
+#include <dns/rrclass.h>
+
+namespace isc {
+namespace datasrc {
+namespace memory {
+class ZoneData {
+public:
+ ZoneData(dns::RRClass zone_class, const dns::Name& zone_name) :
+ zone_class_(zone_class), zone_name_(zone_name)
+ {}
+
+private:
+ const dns::RRClass zone_class_;
+ const dns::Name zone_name_;
+};
+} // namespace memory
+} // namespace datasrc
+} // namespace isc
+
+#endif // DATASRC_MEMORY_ZONE_DATA_H
+
+// Local Variables:
+// mode: c++
+// End:
#include <dns/name.h>
-#include <datasrc/zonetable.h>
-#include <datasrc/rbtree.h>
+#include <datasrc/memory/zone_data.h>
+#include <datasrc/memory/zone_table.h>
+#include <datasrc/memory/domaintree.h>
#include <cassert>
namespace isc {
namespace datasrc {
+namespace memory {
+
+namespace {
+struct ZoneDataDeleter {
+ ZoneDataDeleter() {}
+ void operator()(util::MemorySegment&, ZoneData*) const {}
+};
+}
/// \short Private data and implementation of ZoneTable
struct ZoneTable::ZoneTableImpl {
// Type aliases to make it shorter
- typedef RBTree<ZoneFinder> ZoneTree;
- typedef RBNode<ZoneFinder> ZoneNode;
+ typedef DomainTree<ZoneData, ZoneDataDeleter> ZoneTableTree;
+ typedef DomainTreeNode<ZoneData, ZoneDataDeleter> ZoneTableNode;
// The actual storage
- ZoneTree* zones_;
+ ZoneTableTree* zones_;
// Constructor
ZoneTableImpl(util::MemorySegment& mem_sgmt) :
- zones_(ZoneTree::create(mem_sgmt))
+ zones_(ZoneTableTree::create(mem_sgmt))
{}
/*
*/
// Implementation of ZoneTable::addZone
- result::Result addZone(util::MemorySegment& mem_sgmt, ZoneFinderPtr zone) {
+ result::Result addZone(util::MemorySegment& mem_sgmt,
+ const Name& zone_name, ZoneData* zone_data)
+ {
// Sanity check
- if (!zone) {
+ if (zone_data == NULL) {
isc_throw(InvalidParameter,
"Null pointer is passed to ZoneTable::addZone()");
}
// Get the node where we put the zone
- ZoneNode* node(NULL);
- switch (zones_->insert(mem_sgmt, zone->getOrigin(), &node)) {
+ ZoneTableNode* node(NULL);
+ switch (zones_->insert(mem_sgmt, zone_name, &node)) {
// This is OK
- case ZoneTree::SUCCESS:
- case ZoneTree::ALREADYEXISTS:
+ case ZoneTableTree::SUCCESS:
+ case ZoneTableTree::ALREADYEXISTS:
break;
// Can Not Happen
default:
assert(0);
}
// Can Not Happen
- assert(node);
+ assert(node != NULL);
// Is it empty? We either just created it or it might be nonterminal
if (node->isEmpty()) {
- node->setData(zone);
+ node->setData(mem_sgmt, zone_data);
return (result::SUCCESS);
} else { // There's something there already
return (result::EXIST);
// Implementation of ZoneTable::findZone
ZoneTable::FindResult findZone(const Name& name) const {
- ZoneNode *node(NULL);
+ ZoneTableNode* node(NULL);
result::Result my_result;
// Translate the return codes
switch (zones_->find(name, &node)) {
- case ZoneTree::EXACTMATCH:
+ case ZoneTableTree::EXACTMATCH:
my_result = result::SUCCESS;
break;
- case ZoneTree::PARTIALMATCH:
+ case ZoneTableTree::PARTIALMATCH:
my_result = result::PARTIALMATCH;
break;
// We have no data there, so translate the pointer to NULL as well
- case ZoneTree::NOTFOUND:
+ case ZoneTableTree::NOTFOUND:
return (FindResult(result::NOTFOUND, ZoneFinderPtr()));
// Can Not Happen
default:
}
// Can Not Happen (remember, NOTFOUND is handled)
- assert(node);
+ assert(node != NULL);
- return (FindResult(my_result, node->getData()));
+ // Temporarily return an easy fake value
+ return (FindResult(result::NOTFOUND, ZoneFinderPtr()));
+ //return (FindResult(my_result, node->getData()));
}
};
void
ZoneTable::destroy(util::MemorySegment& mem_sgmt, ZoneTable* ztable) {
- ZoneTableImpl::ZoneTree::destroy(mem_sgmt, ztable->impl_->zones_);
+ ZoneTableImpl::ZoneTableTree::destroy(mem_sgmt, ztable->impl_->zones_);
ztable->~ZoneTable();
mem_sgmt.deallocate(ztable, sizeof(ZoneTable));
}
result::Result
-ZoneTable::addZone(util::MemorySegment& mem_sgmt, ZoneFinderPtr zone) {
- return (impl_->addZone(mem_sgmt, zone));
+ZoneTable::addZone(util::MemorySegment& mem_sgmt, const Name& zone_name,
+ ZoneData* zone_data)
+{
+ return (impl_->addZone(mem_sgmt, zone_name, zone_data));
}
result::Result
return (impl_->findZone(name));
}
+} // end of namespace memory
} // end of namespace datasrc
} // end of namespace isc