diff options
Diffstat (limited to 'src/lib/datasrc/memory/zone_writer_local.h')
-rw-r--r-- | src/lib/datasrc/memory/zone_writer_local.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/lib/datasrc/memory/zone_writer_local.h b/src/lib/datasrc/memory/zone_writer_local.h new file mode 100644 index 0000000000..e387433368 --- /dev/null +++ b/src/lib/datasrc/memory/zone_writer_local.h @@ -0,0 +1,95 @@ +// 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 MEM_ZONE_WRITER_LOCAL_H +#define MEM_ZONE_WRITER_LOCAL_H + +#include "zone_writer.h" + +#include <dns/rrclass.h> +#include <dns/name.h> + +namespace isc { +namespace datasrc { +namespace memory { + +class ZoneData; +class ZoneTableSegmentLocal; + +/// \brief Writer implementation which loads data locally. +/// +/// This implementation prepares a clean zone data and lets one callback +/// to fill it and another to install it somewhere. The class does mostly +/// nothing (and delegates the work to the callbacks), just stores little bit +/// of state between the calls. +class ZoneWriterLocal : public ZoneWriter { +public: + /// \brief Constructor + /// + /// \param segment The zone table segment to store the zone into. + /// \param load_action The callback used to load data. + /// \param origin The origin of the zone. + /// \param rrclass The class of the zone. + ZoneWriterLocal(ZoneTableSegmentLocal* segment, + const LoadAction& load_action, const dns::Name& origin, + const dns::RRClass& rrclass); + + /// \brief Destructor + ~ZoneWriterLocal(); + + /// \brief Loads the data. + /// + /// This calls the load_action (passed to constructor) and stores the + /// data for future use. + /// + /// \throw isc::InvalidOperation if it is called the second time in + /// lifetime of the object. + /// \throw Whatever the load_action throws, it is propagated up. + virtual void load(); + + /// \brief Installs the zone. + /// + /// It modifies the zone table accessible through the segment (passed to + /// constructor). + /// + /// \throw isc::InvalidOperation if it is called the second time in + /// lifetime of the object or if load() was not called previously or if + /// cleanup() was already called. + virtual void install(); + + /// \brief Clean up memory. + /// + /// Cleans up the memory used by load()ed zone if not yet installed, or + /// the old zone replaced by install(). + virtual void cleanup(); +private: + ZoneTableSegmentLocal* segment_; + LoadAction load_action_; + dns::Name origin_; + dns::RRClass rrclass_; + ZoneData* zone_data_; + enum State { + ZW_UNUSED, + ZW_LOADED, + ZW_INSTALLED, + ZW_CLEANED + }; + State state_; +}; + +} +} +} + +#endif |