a problem, you should move the zone to some database backend (sqlite3, for
example) and use it from there.
+% DATASRC_LOAD_CONTEXT_ERROR %1:%2: Zone '%3/%4' contains error: %5
+There's an error in the given master file. The zone won't be loaded for
+this reason. Parsing might follow, so you might get further errors and
+warnings to fix everything at once. But in case the error is serious enough,
+the parser might just give up or get confused and generate false errors
+afterwards.
+
+% DATASRC_LOAD_CONTEXT_WARN %1:%2: Zone '%3/%4' has a potential problem: %5
+There's something suspicious in the master file. This is a warning only.
+It may be a problem or it may be harmless, but it should be checked.
+This problem does not stop the zone from being loaded.
+
% DATASRC_MASTERLOAD_ERROR %1
An error was found in the zone data for a MasterFiles zone. The zone
is not loaded. The specific error is shown in the message, and should
// PERFORMANCE OF THIS SOFTWARE.
#include <datasrc/loader_callbacks.h>
+#include <datasrc/zone.h>
+#include <datasrc/logger.h>
+
+#include <dns/name.h>
+#include <dns/rrclass.h>
+#include <dns/rrset.h>
+
+#include <string>
+#include <boost/bind.hpp>
namespace isc {
namespace datasrc {
+namespace {
+
+void
+logError(const dns::Name& name, const dns::RRClass& rrclass, bool* ok,
+ const std::string& source, size_t line, const std::string& reason)
+{
+ LOG_ERROR(logger, DATASRC_LOAD_CONTEXT_ERROR).arg(source).arg(line).
+ arg(name).arg(rrclass).arg(reason);
+ if (ok != NULL) {
+ *ok = false;
+ }
+}
+
+void
+logWarning(const dns::Name& name, const dns::RRClass& rrclass,
+ const std::string& source, size_t line, const std::string& reason)
+{
+ LOG_WARN(logger, DATASRC_LOAD_CONTEXT_WARN).arg(source).arg(line).
+ arg(name).arg(rrclass).arg(reason);
+}
+
+}
+
+isc::dns::LoaderCallbacks
+createCallbacks(ZoneUpdater& updater, const dns::Name& name,
+ const dns::RRClass& rrclass, bool* ok)
+{
+ return (isc::dns::LoaderCallbacks(boost::bind(&logError, name, rrclass, ok,
+ _1, _2, _3),
+ boost::bind(&logWarning, name, rrclass,
+ _1, _2, _3),
+ boost::bind(&ZoneUpdater::addRRset,
+ &updater,
+ // The callback provides a
+ // shared pointer, we need
+ // the object. This bind
+ // unpacks the object.
+ boost::bind(&dns::RRsetPtr::
+ operator*,
+ _1))));
+}
}
}