RtConfig has limited cache support

Hagen Boehm hboehm at brutus.NIC.DTAG.DE
Tue Jun 12 12:46:43 UTC 2007


hmmm, seems that this mailing list doesn't like my attachments... >:-(

okay, here is the patch again:

######################################################
--- /src/irr/irr.hh.original  Thu Jun  8 17:16:26 2006
+++ /src/irr/irr.hh           Tue Jun 12 11:41:04 2007
@@ -192,6 +192,10 @@
    bool         isIndirectMember(Object *o, 
                           AttrGenericIterator<ItemWORD> &mbrs_by_ref);
 
+  // next method is used by RAWhoisClient to query the SetCache
+  bool queryCache(SymID setID, Set *&set);
+
+
 private:
    static void initCache(char *objectText, int objectLength, char *clss);
 };

--- /src/irr/irr.cc.original  Sun Oct  1 13:23:32 2006
+++ /src/irr/irr.cc           Tue Jun 12 11:39:33 2007
@@ -210,6 +210,10 @@
 Cache<SymID, MPPrefixRanges *> expandRSSetCache;
 Cache<SymID, MPPrefixRanges *> expandRtrSetCache;
 
+bool IRR::queryCache(SymID setID, Set *&set) {
+  return (SetCache.query(setID, set));
+}
+
 void IRR::initCache(char *objectText, int objectLength, char *clss) {
    Buffer b(objectText, objectLength);
    Set *o = new Set(b);

--- /src/irr/rawhoisc.cc.original  Tue Feb 13 01:25:01 2007
+++ /src/irr/rawhoisc.cc           Tue Jun 12 11:46:01 2007
@@ -517,7 +517,7 @@
 }
 
 bool RAWhoisClient::getSet(SymID sname, char *clss, char *&text, int &len) {
-   len = QueryResponse(text, "!m%s,%s", clss, sname);
+   len = QueryResponse(text, "!i%s,1", sname);
    return len;
 }
 
@@ -557,27 +557,59 @@
 }
 
 bool RAWhoisClient::expandASSet(SymID asset, SetOfUInt *result) {
-  char *response;
-  if (!QueryResponse(response, "!i%s,1", asset)) return false;
-  for (char *word = strtok(response, " \t\n"); 
-       word; 
-       word = strtok(NULL, " \t\n"))
-    result->add(atoi(word+2));
-  if (response)
-     delete [] response;
+  Set *set = NULL;
+
+  if (queryCache(asset, set)) {
+    AttrGenericIterator<Item> itr(set, "members");
+    for (Item *pt = itr.first(); pt; pt = itr.next())
+      if (typeid(*pt) == typeid(ItemASNAME)) { // ASNAME (aka as-set)
+         const SetOfUInt *tmp = IRR::expandASSet(((ItemASNAME *)pt)->name);
+         if (tmp) 
+           *result |= *(SetOfUInt *) tmp;
+      } else if (typeid(*pt) == typeid(ItemASNO)) {
+         result->add(((ItemASNO *)pt)->asno);
+      } else {
+       cerr << "WARNING: irrd/rawhoisd cannot resolve as-set " << asset << "!";
+        cerr << "Unknown element found in as-set definition!\n";
+      }
+    if (set != NULL) free (set);
+  } else {
+    char *text;
+    int  len;
+    if (getSet(asset, "as-set", text, len)) {
+      for (char *word = strtok(text, " \t\n"); word; word = strtok(NULL, " \t\n"))
+        result->add(atoi(word+2));
+    }
+    if (text != NULL) free(text);
+  }
+
   return true;
 }
 
 bool RAWhoisClient::expandRSSet(SymID rsset, MPPrefixRanges *result) {
-  char *response;
-  if (!QueryResponse(response, "!i%s,1", rsset)) return false;
-  for (char *word = strtok(response, " \t\n"); 
-       word; 
-       word = strtok(NULL, " \t\n"))
-    result->push_back(MPPrefix(word));
-  if (response)
-     delete [] response;
-  return true;
+  Set *set = NULL;
+
+  if (queryCache(rsset, set)) {
+    AttrGenericIterator<Item> itr(set, "members");
+    for (Item *pt = itr.first(); pt; pt = itr.next()) {
+      expandItem(pt, result);
+    }
+    AttrGenericIterator<Item> itr1(set, "mp-members");
+    for (Item *pt = itr1.first(); pt; pt = itr1.next()) {
+      expandItem(pt, result);
+    }
+    if (set != NULL) free (set);
+  } else {
+    char *text;
+    int  len;
+    if (getSet(rsset, "route-set", text, len)) {
+      for (char *word = strtok(text, " \t\n"); word; word = strtok(NULL, " \t\n"))
+        result->push_back(MPPrefix(word));
+    }
+    if (text != NULL) free(text);
+  }
+
+  return true;  
 }
 
 bool RAWhoisClient::expandRtrSet(SymID sname, MPPrefixRanges *result) {
######################################################

best, 

   Hagen


More information about the irrtoolset mailing list