From 5abead95a1e24e05623276c6fbfb38aa3a8898aa Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Fri, 9 Jul 2010 15:17:26 +0200 Subject: [PATCH] monitoring: eraseByFilter method erases and lists all records matching an AVP filter --- apps/monitoring/Monitoring.cpp | 30 ++++++++++++++++++++---------- apps/monitoring/Monitoring.h | 2 +- doc/Readme.monitoring.txt | 1 + 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/apps/monitoring/Monitoring.cpp b/apps/monitoring/Monitoring.cpp index 797d19fd..dfd8c5f1 100644 --- a/apps/monitoring/Monitoring.cpp +++ b/apps/monitoring/Monitoring.cpp @@ -105,7 +105,7 @@ void Monitor::invoke(const string& method, } else if(method == "list"){ listAll(args,ret); } else if(method == "listByFilter"){ - listByFilter(args,ret); + listByFilter(args,ret, false); } else if(method == "listByRegex"){ listByRegex(args,ret); } else if(method == "listFinished"){ @@ -118,6 +118,8 @@ void Monitor::invoke(const string& method, clearFinished(args,ret); } else if(method == "erase"){ clear(args,ret); + } else if(method == "eraseByFilter"){ + listByFilter(args,ret, true); } else if(method == "_list"){ ret.push(AmArg("log")); ret.push(AmArg("set")); @@ -126,6 +128,7 @@ void Monitor::invoke(const string& method, ret.push(AmArg("markFinished")); ret.push(AmArg("setExpiration")); ret.push(AmArg("erase")); + ret.push(AmArg("eraseByFilter")); ret.push(AmArg("clear")); ret.push(AmArg("clearFinished")); ret.push(AmArg("get")); @@ -321,26 +324,33 @@ void Monitor::listAll(const AmArg& args, AmArg& ret) { } } -void Monitor::listByFilter(const AmArg& args, AmArg& ret) { +void Monitor::listByFilter(const AmArg& args, AmArg& ret, bool erase) { ret.assertArray(); for (int i=0;i::iterator it= - logs[i].log.begin(); it != logs[i].log.end(); it++) { + std::map::iterator it=logs[i].log.begin(); + + while (it != logs[i].log.end()) { bool match = true; - for (size_t i=0;isecond.info[p.get(0).asCStr()]==p.get(1))) { match = false; break; } } - if (!match) - continue; - - ret.push(AmArg(it->first.c_str())); + if (match) { + ret.push(AmArg(it->first.c_str())); + if (erase) { + std::map::iterator d_it=it; + it++; + logs[i].log.erase(d_it); + continue; + } + } + it++; } } catch(...) { logs[i].log_lock.unlock(); diff --git a/apps/monitoring/Monitoring.h b/apps/monitoring/Monitoring.h index 3afc0e15..23b8e01d 100644 --- a/apps/monitoring/Monitoring.h +++ b/apps/monitoring/Monitoring.h @@ -77,7 +77,7 @@ class Monitor void getAttributeActive(const AmArg& args, AmArg& ret); void getAttributeFinished(const AmArg& args, AmArg& ret); void listAll(const AmArg& args, AmArg& ret); - void listByFilter(const AmArg& args, AmArg& ret); + void listByFilter(const AmArg& args, AmArg& ret, bool erase); void listByRegex(const AmArg& args, AmArg& ret); void listFinished(const AmArg& args, AmArg& ret); void listActive(const AmArg& args, AmArg& ret); diff --git a/doc/Readme.monitoring.txt b/doc/Readme.monitoring.txt index 0699012b..d0f8f0e0 100644 --- a/doc/Readme.monitoring.txt +++ b/doc/Readme.monitoring.txt @@ -66,6 +66,7 @@ functions to get values, e.g. from the outside: getAttributeFinished(attr_name) - get a specific attribute from all finished calls, parameter is the attribute name erase(ID) - erase info of a specific call, parameter is the call ID (+free used memory) + eraseByFilter(exp, exp, exp, ...) - list IDs of calls that match the filter expressions and erase them; filter expressions like listByFilter clear() - erase info of all calls (+free used memory) clearFinished() - erase info of all finished calls (+free used memory)