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