diff options
author | Benoit Foucher <benoit@zeroc.com> | 2012-08-10 16:50:35 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2012-08-10 16:50:35 +0200 |
commit | 1a8efa00ee1fcd474f85b71a3cd8b43b9819d58e (patch) | |
tree | 928ee2b9201ba70f8d8deb8bad46d1af6acdc1aa /cpp/src/Ice/MetricsAdminI.cpp | |
parent | Windows fixes (diff) | |
download | ice-1a8efa00ee1fcd474f85b71a3cd8b43b9819d58e.tar.bz2 ice-1a8efa00ee1fcd474f85b71a3cd8b43b9819d58e.tar.xz ice-1a8efa00ee1fcd474f85b71a3cd8b43b9819d58e.zip |
Added regexp support for Accept/Reject
Diffstat (limited to 'cpp/src/Ice/MetricsAdminI.cpp')
-rw-r--r-- | cpp/src/Ice/MetricsAdminI.cpp | 108 |
1 files changed, 39 insertions, 69 deletions
diff --git a/cpp/src/Ice/MetricsAdminI.cpp b/cpp/src/Ice/MetricsAdminI.cpp index 9cf34111335..30f59eed52a 100644 --- a/cpp/src/Ice/MetricsAdminI.cpp +++ b/cpp/src/Ice/MetricsAdminI.cpp @@ -23,24 +23,52 @@ using namespace IceMX; namespace { -NameValueDict +vector<MetricsMapI::RegExpPtr> parseRule(const ::Ice::PropertiesPtr& properties, const string& name) { - NameValueDict dict; + vector<MetricsMapI::RegExpPtr> regexps; PropertyDict rules = properties->getPropertiesForPrefix(name + '.'); for(PropertyDict::const_iterator p = rules.begin(); p != rules.end(); ++p) { - dict.insert(make_pair(p->first.substr(name.size() + 1), p->second)); + regexps.push_back(new MetricsMapI::RegExp(p->first.substr(name.length() + 1), p->second)); } - return dict; + return regexps; } -bool -match(const string& value, const string& expr) +} + +MetricsMapI::RegExp::RegExp(const string& attribute, const string& regexp) : _attribute(attribute) { - return true; // TODO +#ifndef ICE_CPP11_REGEXP + if(regcomp(&_preg, regexp.c_str(), REG_EXTENDED | REG_NOSUB) != 0) + { + throw Ice::SyscallException(__FILE__, __LINE__); + } +#else + _regex = regex(regexp, std::regex_constants::extended | std::regex_constants::nosubs); +#endif } +MetricsMapI::RegExp::~RegExp() +{ +#ifndef ICE_CPP11_REGEXP + regfree(&_preg); +#endif +} + +bool +MetricsMapI::RegExp::match(const MetricsHelper& helper) +{ + string value = helper(_attribute); +#ifndef ICE_CPP11_REGEXP + if(regexec(&_preg, value.c_str(), 0, 0, 0) == 0) + { + return true; + } + return false; +#else + return regex_match(value, _regex); +#endif } MetricsMapI::MetricsMapI(const std::string& mapPrefix, const Ice::PropertiesPtr& properties) : @@ -132,17 +160,17 @@ MetricsMapI::getFailures() MetricsMapI::EntryPtr MetricsMapI::getMatching(const MetricsHelper& helper) { - for(map<string, string>::const_iterator p = _accept.begin(); p != _accept.end(); ++p) + for(vector<RegExpPtr>::const_iterator p = _accept.begin(); p != _accept.end(); ++p) { - if(!match(helper(p->first), p->second)) + if(!(*p)->match(helper)) { return 0; } } - for(map<string, string>::const_iterator p = _reject.begin(); p != _reject.end(); ++p) + for(vector<RegExpPtr>::const_iterator p = _reject.begin(); p != _reject.end(); ++p) { - if(match(helper(p->first), p->second)) + if((*p)->match(helper)) { return 0; } @@ -380,61 +408,3 @@ MetricsAdminI::getMetricsFailures(const string& view, const string& map, const : } return p->second->getFailures(map); } - -void -MetricsAdminI::addMapToView(const string& view, - const string& mapName, - const string& groupBy, - int retain, - const NameValueDict& accept, - const NameValueDict& reject, - const ::Ice::Current&) -{ - UpdaterPtr updater; - { - // TODO: XXX - // Lock sync(*this); - // map<string, MetricsViewIPtr>::const_iterator p = _views.find(view); - // if(p == _views.end()) - // { - // p = _views.insert(make_pair(view, new MetricsViewI(true))).first; - // } - // p->second->add(mapName, _factories[mapName]->create()); - - // map<string, UpdaterPtr>::const_iterator q = _updaters.find(mapName); - // if(q != _updaters.end()) - // { - // updater = q->second; - // } - } - if(updater) - { - updater->update(); - } -} - -void -MetricsAdminI::removeMapFromView(const string& view, const string& mapName, const ::Ice::Current&) -{ - UpdaterPtr updater; - { - Lock sync(*this); - map<string, MetricsViewIPtr>::const_iterator p = _views.find(view); - if(p == _views.end()) - { - throw UnknownMetricsView(); - } - p->second->remove(mapName); - - map<string, UpdaterPtr>::const_iterator q = _updaters.find(mapName); - if(q != _updaters.end()) - { - updater = q->second; - } - } - if(updater) - { - updater->update(); - } -} - |