From: JINMEI Tatuya Date: Wed, 8 Aug 2012 23:48:36 +0000 (-0700) Subject: [2100] return the created zone data from addZone. X-Git-Tag: trac2351_base~115^2~3^2~10 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2e9fc841b3315b7c52166a49ce8299de2d251699;p=thirdparty%2Fkea.git [2100] return the created zone data from addZone. --- diff --git a/src/lib/datasrc/memory/tests/zone_table_unittest.cc b/src/lib/datasrc/memory/tests/zone_table_unittest.cc index 73f53c3225..3a978d3b64 100644 --- a/src/lib/datasrc/memory/tests/zone_table_unittest.cc +++ b/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()); } diff --git a/src/lib/datasrc/memory/zone_table.cc b/src/lib/datasrc/memory/zone_table.cc index c291b6ef9f..660a0c76f1 100644 --- a/src/lib/datasrc/memory/zone_table.cc +++ b/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())); } } diff --git a/src/lib/datasrc/memory/zone_table.h b/src/lib/datasrc/memory/zone_table.h index ed28f43d92..59379a30ed 100644 --- a/src/lib/datasrc/memory/zone_table.h +++ b/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 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. ///