/// If it throws, you still need to call cleanup().
///
/// \throw isc::Unexpected if called without previous load() or for the
- /// second time.
+ /// second time or cleanup() was called already.
virtual void install() = 0;
/// \brief Clean up resources.
///
// TODO: Somehow specify what the ID is
class ZoneSegmentID {};
+/// \brief Callback to load data into the memory
+///
+/// This is called with a clean (empty) zone data. The goal of the
+/// callback is to get the data for the zone from somewhere and put
+/// them into the passed ZoneData parameter.
typedef boost::function<void(ZoneData*)> LoadAction;
+/// \brief Install the zone somewhere.
+///
+/// The goal of the callback is to take the zone data (contained in the
+/// ZoneSegment and identified by ZoneSegmentID) and put it somewhere
+/// to use. The return value should contain the old copy of the zone, if
+/// there was any (it may be NULL). The updater will then destroy it.
+///
+/// Upon successful completion, the ownership of the new zone is passed
+/// to the callback and the old to the updater.
typedef boost::function<ZoneData* (ZoneSegmentID, ZoneSegment*)> InstallAction;
+/// \brief Updater 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 ZoneUpdaterLocal : public ZoneUpdater {
public:
+ /// \brief Constructor
+ ///
+ /// \param segment The zone table segment to store the zone into.
+ /// \param load_action The callback used to load data.
+ /// \param install_action The callback used to install the loaded zone.
ZoneUpdaterLocal(ZoneTableSegment* segment, const LoadAction& load_action,
const InstallAction& install_action);
- ~ ZoneUpdaterLocal();
+ /// \brief Destructor
+ ~ZoneUpdaterLocal();
+ /// \brief Loads the data.
+ ///
+ /// This prepares an empty ZoneData and calls load_action (passed to
+ /// constructor) to fill it with data.
+ ///
+ /// \throw std::bad_alloc If there's a problem allocating the ZoneData.
+ /// \throw isc::Unexpected 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.
+ ///
+ /// This simply calls the install_action.
+ ///
+ /// \throw isc::Unexpected 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.
+ /// \throw Whatever the install_action throws, it is propagated up.
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();
};