]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2435] Make ZoneUpdater return a corresponding RRsetCollection for itself
authorMukund Sivaraman <muks@isc.org>
Wed, 9 Jan 2013 12:41:35 +0000 (18:11 +0530)
committerMukund Sivaraman <muks@isc.org>
Wed, 9 Jan 2013 12:41:35 +0000 (18:11 +0530)
src/lib/datasrc/database.cc
src/lib/datasrc/rrset_collection.cc
src/lib/datasrc/rrset_collection.h
src/lib/datasrc/tests/database_unittest.cc
src/lib/datasrc/tests/master_loader_callbacks_test.cc
src/lib/datasrc/tests/zone_loader_unittest.cc
src/lib/datasrc/zone.h
src/lib/dns/rrset_collection_base.h

index d791fbcc1a557a333c5f7b0762002ba5e8a12aff..12c3f87ecb6d74d2e60cca85b70c70e27dbd07fb 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <datasrc/data_source.h>
 #include <datasrc/logger.h>
+#include <datasrc/rrset_collection.h>
 
 #include <boost/foreach.hpp>
 #include <boost/scoped_ptr.hpp>
@@ -1411,6 +1412,10 @@ public:
 
     virtual ZoneFinder& getFinder() { return (*finder_); }
 
+    virtual RRsetCollectionPtr getRRsetCollection() {
+        return (RRsetCollectionPtr(new RRsetCollection(*this, zone_class_)));
+    }
+
     virtual void addRRset(const AbstractRRset& rrset);
     virtual void deleteRRset(const AbstractRRset& rrset);
     virtual void commit();
index 771ce7dba4f04b65f0983203d627b74ec5face4c..0651dec79e6be6aa9bc4b2c91de8ca22b1f7c660 100644 (file)
@@ -35,7 +35,7 @@ RRsetCollection::find(const isc::dns::Name& name,
         return (ConstRRsetPtr());
     }
 
-    ZoneFinder& finder = updater_->getFinder();
+    ZoneFinder& finder = updater_.getFinder();
     try {
         ZoneFinderContextPtr result =
             finder.find(name, rrtype,
index ec3dcf0d0ae953f9db9250265fe30c99bbb86be7..090732329278c97d9137f8a1c57d097b5f63fbce 100644 (file)
@@ -27,14 +27,13 @@ class RRsetCollection : public isc::dns::RRsetCollectionBase {
 public:
     /// \brief Constructor.
     ///
-    /// A reference to the \c updater (via \c shared_ptr) is taken when
-    /// the collection is constructed. As long as the collection object
-    /// is alive, the reference to the updater is kept and it cannot be
-    /// destroyed by the client.
+    /// No reference (count via \c shared_ptr) to the ZoneUpdater is
+    /// acquired. As long as the collection object is alive, the
+    /// corresponding \c ZoneUpdater should be kept alive.
     ///
     /// \param updater The ZoneUpdater to wrap around.
     /// \param rrclass The RRClass of the records in the zone.
-    RRsetCollection(ZoneUpdaterPtr updater, const isc::dns::RRClass& rrclass) :
+    RRsetCollection(ZoneUpdater& updater, const isc::dns::RRClass& rrclass) :
         updater_(updater),
         rrclass_(rrclass)
     {}
@@ -58,7 +57,7 @@ public:
                                          const isc::dns::RRType& rrtype) const;
 
 private:
-    ZoneUpdaterPtr updater_;
+    ZoneUpdater& updater_;
     isc::dns::RRClass rrclass_;
 
 protected:
index 3aff9ca50a18aafcea1463b54edf96e8725cf1bc..0c85aea6a7d8e3948b85179f4e5eb46df16b8429 100644 (file)
@@ -4162,17 +4162,18 @@ class RRsetCollectionTest : public DatabaseClientTest<ACCESSOR_TYPE> {
 public:
     RRsetCollectionTest() :
         DatabaseClientTest<ACCESSOR_TYPE>(),
-        collection(this->client_->getUpdater(this->zname_, false),
-                   this->qclass_)
+        updater(this->client_->getUpdater(this->zname_, false)),
+        collection(updater->getRRsetCollection())
     {}
 
-    RRsetCollection collection;
+    ZoneUpdaterPtr updater;
+    RRsetCollectionPtr collection;
 };
 
 TYPED_TEST(RRsetCollectionTest, find) {
     // Test the find() that returns ConstRRsetPtr
-    ConstRRsetPtr rrset = this->collection.find(Name("www.example.org."),
-                                                RRClass::IN(), RRType::A());
+    ConstRRsetPtr rrset = this->collection->find(Name("www.example.org."),
+                                                 RRClass::IN(), RRType::A());
     ASSERT_TRUE(rrset);
     EXPECT_EQ(RRType::A(), rrset->getType());
     EXPECT_EQ(RRTTL(3600), rrset->getTTL());
@@ -4180,46 +4181,47 @@ TYPED_TEST(RRsetCollectionTest, find) {
     EXPECT_EQ(Name("www.example.org"), rrset->getName());
 
     // foo.example.org doesn't exist
-    rrset = this->collection.find(Name("foo.example.org"), this->qclass_,
-                                  RRType::A());
+    rrset = this->collection->find(Name("foo.example.org"), this->qclass_,
+                                   RRType::A());
     EXPECT_FALSE(rrset);
 
     // www.example.org exists, but not with MX
-    rrset = this->collection.find(Name("www.example.org"), this->qclass_,
-                                  RRType::MX());
+    rrset = this->collection->find(Name("www.example.org"), this->qclass_,
+                                   RRType::MX());
     EXPECT_FALSE(rrset);
 
     // www.example.org exists, with AAAA
-    rrset = this->collection.find(Name("www.example.org"), this->qclass_,
-                                  RRType::AAAA());
+    rrset = this->collection->find(Name("www.example.org"), this->qclass_,
+                                   RRType::AAAA());
     EXPECT_TRUE(rrset);
 
     // www.example.org with AAAA does not exist in RRClass::CH()
-    rrset = this->collection.find(Name("www.example.org"), RRClass::CH(),
-                                  RRType::AAAA());
+    rrset = this->collection->find(Name("www.example.org"), RRClass::CH(),
+                                   RRType::AAAA());
     EXPECT_FALSE(rrset);
 
     // Out of zone find()s must not throw.
-    rrset = this->collection.find(Name("www.example.com"), this->qclass_,
-                                  RRType::A());
+    rrset = this->collection->find(Name("www.example.com"), this->qclass_,
+                                   RRType::A());
     EXPECT_FALSE(rrset);
 }
 
 TYPED_TEST(RRsetCollectionTest, iteratorTest) {
     // Iterators are currently not implemented.
-    EXPECT_THROW(this->collection.begin(), isc::NotImplemented);
-    EXPECT_THROW(this->collection.end(), isc::NotImplemented);
+    EXPECT_THROW(this->collection->begin(), isc::NotImplemented);
+    EXPECT_THROW(this->collection->end(), isc::NotImplemented);
 }
 
 class MockRRsetCollectionTest : public DatabaseClientTest<MockAccessor> {
 public:
     MockRRsetCollectionTest() :
         DatabaseClientTest<MockAccessor>(),
-        collection(this->client_->getUpdater(this->zname_, false),
-                   this->qclass_)
+        updater(this->client_->getUpdater(this->zname_, false)),
+        collection(updater->getRRsetCollection())
     {}
 
-    RRsetCollection collection;
+    ZoneUpdaterPtr updater;
+    RRsetCollectionPtr collection;
 };
 
 TEST_F(MockRRsetCollectionTest, findError) {
@@ -4230,8 +4232,8 @@ TEST_F(MockRRsetCollectionTest, findError) {
     // The "dsexception.example.org." name is rigged by the MockAccessor
     // to throw a DataSourceError.
     EXPECT_THROW({
-        this->collection.find(Name("dsexception.example.org"), this->qclass_,
-                              RRType::A());
+        this->collection->find(Name("dsexception.example.org"), this->qclass_,
+                               RRType::A());
     }, RRsetCollectionBase::FindError);
 }
 
index 19ec4d2bfc03712525e5a96c59be0d47f0908add..ecc0f283d0abcfadd3722de1047586192cd013c7 100644 (file)
@@ -65,6 +65,9 @@ public:
     virtual ZoneFinder& getFinder() {
         isc_throw(isc::NotImplemented, "Not to be called in this test");
     }
+    virtual isc::dns::RRsetCollectionPtr getRRsetCollection() {
+        isc_throw(isc::NotImplemented, "Not to be called in this test");
+    }
     virtual void deleteRRset(const isc::dns::AbstractRRset&) {
         isc_throw(isc::NotImplemented, "Not to be called in this test");
     }
index b19a843fb9dd76b03397be7632d03bc05c1fad5a..b8517f4bc3b69e9f621e3016cf0535ba8212e2d8 100644 (file)
@@ -89,6 +89,9 @@ public:
     virtual ZoneFinder& getFinder() {
         return (finder_);
     }
+    virtual isc::dns::RRsetCollectionPtr getRRsetCollection() {
+        isc_throw(isc::NotImplemented, "Method not used in tests");
+    }
     virtual void addRRset(const isc::dns::AbstractRRset& rrset) {
         if (client_->commit_called_) {
             isc_throw(DataSourceError, "Add after commit");
index 0d7438daa5892cd9e714d799a0f41800b45d9122..3b61cd8d1609e9ced8d42597b5bb3750dd3a8225 100644 (file)
@@ -18,6 +18,7 @@
 #include <dns/name.h>
 #include <dns/rrset.h>
 #include <dns/rrtype.h>
+#include <dns/rrset_collection_base.h>
 
 #include <datasrc/exceptions.h>
 #include <datasrc/result.h>
@@ -802,6 +803,9 @@ public:
     /// \return A reference to a \c ZoneFinder for the updated zone
     virtual ZoneFinder& getFinder() = 0;
 
+    /// Return an RRsetCollection for the updater.
+    virtual isc::dns::RRsetCollectionPtr getRRsetCollection() = 0;
+
     /// Add an RRset to a zone via the updater
     ///
     /// This may be revisited in a future version, but right now the intended
index ff2617fc9e0adeb5a7a2c016c36327ec7cd790bf..fbcbeeb5164dd9f4dea01e845b82505a33128b8f 100644 (file)
@@ -167,6 +167,8 @@ public:
     }
 };
 
+typedef boost::shared_ptr<RRsetCollectionBase> RRsetCollectionPtr;
+
 } // end of namespace dns
 } // end of namespace isc