monitoring: eraseByFilter method

erases and lists all records matching an AVP filter
sayer/1.4-spce2.6
Stefan Sayer 16 years ago
parent 2e6cdd78d4
commit 5abead95a1

@ -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<NUM_LOG_BUCKETS;i++) {
logs[i].log_lock.lock();
try {
for (std::map<string, LogInfo>::iterator it=
logs[i].log.begin(); it != logs[i].log.end(); it++) {
std::map<string, LogInfo>::iterator it=logs[i].log.begin();
while (it != logs[i].log.end()) {
bool match = true;
for (size_t i=0;i<args.size();i++) {
AmArg& p = args.get(i);
for (size_t a_i=0;a_i<args.size();a_i++) {
AmArg& p = args.get(a_i);
if (!(it->second.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<string, LogInfo>::iterator d_it=it;
it++;
logs[i].log.erase(d_it);
continue;
}
}
it++;
}
} catch(...) {
logs[i].log_lock.unlock();

@ -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);

@ -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)

Loading…
Cancel
Save