Browse Source

[2100] return the created zone data from addZone.

JINMEI Tatuya 12 years ago
parent
commit
2e9fc841b3

+ 20 - 12
src/lib/datasrc/memory/tests/zone_table_unittest.cc

@@ -86,14 +86,21 @@ TEST_F(ZoneTableTest, create) {
 }
 
 TEST_F(ZoneTableTest, addZone) {
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1));
-    EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zname1));
+    // Normal successful case.
+    const ZoneTable::AddResult result1 =
+        zone_table->addZone(mem_sgmt_, zname1);
+    EXPECT_EQ(result::SUCCESS, result1.code);
+
+    // Duplicate add doesn't replace the existing data.
+    EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_, zname1).code);
+    EXPECT_EQ(result1.zone_data,
+              zone_table->addZone(mem_sgmt_, zname1).zone_data);
     // names are compared in a case insensitive manner.
     EXPECT_EQ(result::EXIST, zone_table->addZone(mem_sgmt_,
-                                                 Name("EXAMPLE.COM")));
+                                                 Name("EXAMPLE.COM")).code);
     // Add some more different ones.  Should just succeed.
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2));
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3));
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2).code);
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3).code);
 
     // Have the memory segment throw an exception in extending the internal
     // tree.  It still shouldn't cause memory leak (which would be detected
@@ -104,18 +111,18 @@ TEST_F(ZoneTableTest, addZone) {
 }
 
 TEST_F(ZoneTableTest, DISABLED_removeZone) {
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1));
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2));
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3));
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1).code);
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2).code);
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3).code);
 
     EXPECT_EQ(result::SUCCESS, zone_table->removeZone(Name("example.net")));
     EXPECT_EQ(result::NOTFOUND, zone_table->removeZone(Name("example.net")));
 }
 
 TEST_F(ZoneTableTest, DISABLED_findZone) {
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1));
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2));
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3));
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname1).code);
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname2).code);
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, zname3).code);
 
     EXPECT_EQ(result::SUCCESS, zone_table->findZone(Name("example.com")).code);
     EXPECT_EQ(Name("example.com"),
@@ -135,7 +142,8 @@ TEST_F(ZoneTableTest, DISABLED_findZone) {
 
     // make sure the partial match is indeed the longest match by adding
     // a zone with a shorter origin and query again.
-    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_, Name("com")));
+    EXPECT_EQ(result::SUCCESS, zone_table->addZone(mem_sgmt_,
+                                                   Name("com")).code);
     EXPECT_EQ(Name("example.com"),
               zone_table->findZone(Name("www.example.com")).zone->getOrigin());
 }

+ 4 - 4
src/lib/datasrc/memory/zone_table.cc

@@ -70,7 +70,7 @@ ZoneTable::destroy(util::MemorySegment& mem_sgmt, ZoneTable* ztable) {
     mem_sgmt.deallocate(ztable, sizeof(ZoneTable));
 }
 
-result::Result
+ZoneTable::AddResult
 ZoneTable::addZone(util::MemorySegment& mem_sgmt, const Name& zone_name) {
     // Create a new ZoneData instance first.  If the specified name already
     // exists in the table, the new data will soon be destroyed, but we want
@@ -96,10 +96,10 @@ ZoneTable::addZone(util::MemorySegment& mem_sgmt, const Name& zone_name) {
 
     // Is it empty? We either just created it or it might be nonterminal
     if (node->isEmpty()) {
-        node->setData(mem_sgmt, holder.release());
-        return (result::SUCCESS);
+        node->setData(mem_sgmt, holder.get());
+        return (AddResult(result::SUCCESS, holder.release()));
     } else { // There's something there already
-        return (result::EXIST);
+        return (AddResult(result::EXIST, node->getData()));
     }
 }
 

+ 10 - 2
src/lib/datasrc/memory/zone_table.h

@@ -46,6 +46,7 @@ class ZoneData;
 /// corresponding struct and interfaces of \c MemoryDataSrc.
 class ZoneTable {
 private:
+    // The deleter for the zone data stored in the table.
     struct ZoneDataDeleter {
         ZoneDataDeleter() {}
         void operator()(util::MemorySegment& mem_sgmt,
@@ -60,6 +61,13 @@ private:
     typedef DomainTreeNode<ZoneData, ZoneDataDeleter> ZoneTableNode;
 
 public:
+    struct AddResult {
+        AddResult(result::Result param_code, ZoneData* param_zone_data) :
+            code(param_code), zone_data(param_zone_data)
+        {}
+        const result::Result code;
+        ZoneData* const zone_data;
+    };
     struct FindResult {
         FindResult(result::Result param_code, const ZoneFinderPtr param_zone) :
             code(param_code), zone(param_zone)
@@ -123,8 +131,8 @@ public:
     /// added to the zone table.
     /// \return \c result::EXIST The zone table already contains
     /// zone of the same origin.
-    result::Result addZone(util::MemorySegment& mem_sgmt,
-                           const dns::Name& zone_name);
+    AddResult addZone(util::MemorySegment& mem_sgmt,
+                      const dns::Name& zone_name);
 
     /// Remove a \c Zone of the given origin name from the \c ZoneTable.
     ///