Browse Source

[2376] Implement the createCallbacks function

Michal 'vorner' Vaner 12 years ago
parent
commit
94b80d73b6
2 changed files with 62 additions and 0 deletions
  1. 12 0
      src/lib/datasrc/datasrc_messages.mes
  2. 50 0
      src/lib/datasrc/loader_callbacks.cc

+ 12 - 0
src/lib/datasrc/datasrc_messages.mes

@@ -305,6 +305,18 @@ Therefore, the zone will not be available for this process. If this is
 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

+ 50 - 0
src/lib/datasrc/loader_callbacks.cc

@@ -13,10 +13,60 @@
 // 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))));
+}
 
 }
 }