From: Mukund Sivaraman Date: Wed, 3 Oct 2012 09:58:16 +0000 (+0530) Subject: [2268] Remove pimpl from InMemoryClient X-Git-Tag: trac2402_base~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86fcb73a66e62bda72bf5d6aea7f1f852c7f5739;p=thirdparty%2Fkea.git [2268] Remove pimpl from InMemoryClient --- diff --git a/src/lib/datasrc/memory/memory_client.cc b/src/lib/datasrc/memory/memory_client.cc index dc75f53857..6c22347740 100644 --- a/src/lib/datasrc/memory/memory_client.cc +++ b/src/lib/datasrc/memory/memory_client.cc @@ -38,7 +38,6 @@ #include #include -#include #include #include #include @@ -63,63 +62,13 @@ namespace memory { using detail::SegmentObjectHolder; -namespace { -// Some type aliases -typedef DomainTree FileNameTree; -typedef DomainTreeNode FileNameNode; - -// A functor type used for loading. -typedef boost::function LoadCallback; - -} // end of anonymous namespace - -/// Implementation details for \c InMemoryClient hidden from the public -/// interface. -/// -/// For now, \c InMemoryClient only contains a \c ZoneTable object, which -/// consists of (pointers to) \c InMemoryZoneFinder objects, we may add more -/// member variables later for new features. -class InMemoryClient::InMemoryClientImpl { -private: - // The deleter for the filenames stored in the tree. - struct FileNameDeleter { - FileNameDeleter() {} - void operator()(std::string* filename) const { - delete filename; - } - }; - +class InMemoryClient::FileNameDeleter { public: - InMemoryClientImpl(util::MemorySegment& mem_sgmt, RRClass rrclass) : - mem_sgmt_(mem_sgmt), - rrclass_(rrclass), - zone_count_(0), - zone_table_(ZoneTable::create(mem_sgmt_, rrclass)), - file_name_tree_(FileNameTree::create(mem_sgmt_, false)) - {} - ~InMemoryClientImpl() { - FileNameDeleter deleter; - FileNameTree::destroy(mem_sgmt_, file_name_tree_, deleter); + FileNameDeleter() {} - ZoneTable::destroy(mem_sgmt_, zone_table_, rrclass_); + void operator()(std::string* filename) const { + delete filename; } - - util::MemorySegment& mem_sgmt_; - const RRClass rrclass_; - unsigned int zone_count_; - ZoneTable* zone_table_; - FileNameTree* file_name_tree_; - - // Common process for zone load. - // rrset_installer is a functor that takes another functor as an argument, - // and expected to call the latter for each RRset of the zone. How the - // sequence of the RRsets is generated depends on the internal - // details of the loader: either from a textual master file or from - // another data source. - // filename is the file name of the master file or empty if the zone is - // loaded from another data source. - result::Result load(const Name& zone_name, const string& filename, - boost::function rrset_installer); }; // A helper internal class for load(). make it non-copyable to avoid @@ -226,10 +175,9 @@ private: }; result::Result -InMemoryClient::InMemoryClientImpl::load( - const Name& zone_name, - const string& filename, - boost::function rrset_installer) +InMemoryClient::load(const Name& zone_name, + const string& filename, + boost::function rrset_installer) { SegmentObjectHolder holder( mem_sgmt_, ZoneData::create(mem_sgmt_, zone_name), rrclass_); @@ -304,14 +252,16 @@ namespace { // doesn't seem to do this conversion if we just pass 'callback'. void masterLoadWrapper(const char* const filename, const Name& origin, - const RRClass& zone_class, LoadCallback callback) + const RRClass& zone_class, + InMemoryClient::LoadCallback callback) { masterLoad(filename, origin, zone_class, boost::bind(callback, _1)); } -// The installer called from Impl::load() for the iterator version of load(). +// The installer called from load() for the iterator version of load(). void -generateRRsetFromIterator(ZoneIterator* iterator, LoadCallback callback) { +generateRRsetFromIterator(ZoneIterator* iterator, + InMemoryClient::LoadCallback callback) { ConstRRsetPtr rrset; while ((rrset = iterator->getNextRRset()) != NULL) { callback(rrset); @@ -321,21 +271,28 @@ generateRRsetFromIterator(ZoneIterator* iterator, LoadCallback callback) { InMemoryClient::InMemoryClient(util::MemorySegment& mem_sgmt, RRClass rrclass) : - impl_(new InMemoryClientImpl(mem_sgmt, rrclass)) + mem_sgmt_(mem_sgmt), + rrclass_(rrclass), + zone_count_(0), + zone_table_(ZoneTable::create(mem_sgmt_, rrclass)), + file_name_tree_(FileNameTree::create(mem_sgmt_, false)) {} InMemoryClient::~InMemoryClient() { - delete impl_; + FileNameDeleter deleter; + FileNameTree::destroy(mem_sgmt_, file_name_tree_, deleter); + + ZoneTable::destroy(mem_sgmt_, zone_table_, rrclass_); } RRClass InMemoryClient::getClass() const { - return (impl_->rrclass_); + return (rrclass_); } unsigned int InMemoryClient::getZoneCount() const { - return (impl_->zone_count_); + return (zone_count_); } isc::datasrc::DataSourceClient::FindResult @@ -343,7 +300,7 @@ InMemoryClient::findZone(const isc::dns::Name& zone_name) const { LOG_DEBUG(logger, DBG_TRACE_DATA, DATASRC_MEMORY_MEM_FIND_ZONE).arg(zone_name); - ZoneTable::FindResult result(impl_->zone_table_->findZone(zone_name)); + ZoneTable::FindResult result(zone_table_->findZone(zone_name)); ZoneFinderPtr finder; if (result.code != result::NOTFOUND) { @@ -355,7 +312,7 @@ InMemoryClient::findZone(const isc::dns::Name& zone_name) const { const ZoneData* InMemoryClient::findZoneData(const isc::dns::Name& zone_name) { - ZoneTable::FindResult result(impl_->zone_table_->findZone(zone_name)); + ZoneTable::FindResult result(zone_table_->findZone(zone_name)); return (result.zone_data); } @@ -365,24 +322,23 @@ InMemoryClient::load(const isc::dns::Name& zone_name, LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEMORY_MEM_LOAD).arg(zone_name). arg(filename); - return (impl_->load(zone_name, filename, - boost::bind(masterLoadWrapper, filename.c_str(), - zone_name, getClass(), _1))); + return (load(zone_name, filename, + boost::bind(masterLoadWrapper, filename.c_str(), + zone_name, getClass(), _1))); } result::Result InMemoryClient::load(const isc::dns::Name& zone_name, ZoneIterator& iterator) { - return (impl_->load(zone_name, string(), - boost::bind(generateRRsetFromIterator, - &iterator, _1))); + return (load(zone_name, string(), + boost::bind(generateRRsetFromIterator, + &iterator, _1))); } const std::string InMemoryClient::getFileName(const isc::dns::Name& zone_name) const { FileNameNode* node(NULL); - FileNameTree::Result result = impl_->file_name_tree_->find(zone_name, - &node); + FileNameTree::Result result = file_name_tree_->find(zone_name, &node); if (result == FileNameTree::EXACTMATCH) { return (*node->getData()); } else { @@ -394,8 +350,7 @@ result::Result InMemoryClient::add(const isc::dns::Name& zone_name, const ConstRRsetPtr& rrset) { - const ZoneTable::FindResult result = - impl_->zone_table_->findZone(zone_name); + const ZoneTable::FindResult result = zone_table_->findZone(zone_name); if (result.code != result::SUCCESS) { isc_throw(DataSourceError, "No such zone: " + zone_name.toText()); } @@ -403,8 +358,7 @@ InMemoryClient::add(const isc::dns::Name& zone_name, const ConstRRsetPtr sig_rrset = rrset ? rrset->getRRsig() : ConstRRsetPtr(); - ZoneDataUpdater updater(impl_->mem_sgmt_, impl_->rrclass_, - zone_name, *result.zone_data); + ZoneDataUpdater updater(mem_sgmt_, rrclass_, zone_name, *result.zone_data); updater.add(rrset, sig_rrset); // add() doesn't allow duplicate add, so we always return SUCCESS. @@ -525,7 +479,7 @@ public: ZoneIteratorPtr InMemoryClient::getIterator(const Name& name, bool separate_rrs) const { - ZoneTable::FindResult result(impl_->zone_table_->findZone(name)); + ZoneTable::FindResult result(zone_table_->findZone(name)); if (result.code != result::SUCCESS) { isc_throw(DataSourceError, "No such zone: " + name.toText()); } diff --git a/src/lib/datasrc/memory/memory_client.h b/src/lib/datasrc/memory/memory_client.h index 61c1be02e6..438e3fb4eb 100644 --- a/src/lib/datasrc/memory/memory_client.h +++ b/src/lib/datasrc/memory/memory_client.h @@ -22,6 +22,8 @@ #include #include +#include + #include namespace isc { @@ -204,11 +206,35 @@ public: getJournalReader(const isc::dns::Name& zone, uint32_t begin_serial, uint32_t end_serial) const; + // A functor type used for loading. + typedef boost::function LoadCallback; + private: - // TODO: Do we still need the PImpl if nobody should manipulate this class - // directly any more (it should be handled through DataSourceClient)? - class InMemoryClientImpl; - InMemoryClientImpl* impl_; + // Some type aliases + typedef DomainTree FileNameTree; + typedef DomainTreeNode FileNameNode; + + // Common process for zone load. + // rrset_installer is a functor that takes another functor as an argument, + // and expected to call the latter for each RRset of the zone. How the + // sequence of the RRsets is generated depends on the internal + // details of the loader: either from a textual master file or from + // another data source. + // filename is the file name of the master file or empty if the zone is + // loaded from another data source. + result::Result load(const isc::dns::Name& zone_name, + const std::string& filename, + boost::function rrset_installer); + + util::MemorySegment& mem_sgmt_; + const isc::dns::RRClass rrclass_; + unsigned int zone_count_; + ZoneTable* zone_table_; + FileNameTree* file_name_tree_; + + // A helper internal class used by the memory client, used for + // deleting filenames stored in an internal tree. + class FileNameDeleter; // A helper internal class used by load(). It maintains some intermediate // states while loading RRs of the zone.