diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2012-08-23 13:31:57 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2012-08-23 13:31:57 +0200 |
commit | 07694570b09524881d01df7c857cc8f471f1ad04 (patch) | |
tree | 8cae77df7bb081c1b7d37a587d11c765769d3643 /server/src/luaquerymapper.cc | |
parent | 05732251c115b3538879ca523c461572115c6526 (diff) | |
parent | 909c48a297d7f68b107fce7ad444c2165f749f42 (diff) |
Merge branch 'master' of http://git.aasimon.org/public/pracro
Diffstat (limited to 'server/src/luaquerymapper.cc')
-rw-r--r-- | server/src/luaquerymapper.cc | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/server/src/luaquerymapper.cc b/server/src/luaquerymapper.cc index 27dc21f..56ea1e9 100644 --- a/server/src/luaquerymapper.cc +++ b/server/src/luaquerymapper.cc @@ -109,9 +109,53 @@ LUAQueryMapper::~LUAQueryMapper() if(L) lua_close(L); } +static QueryResult splitgroups(QueryResult r) +{ + QueryResult result; + + result.timestamp = r.timestamp; + result.source = r.source; + + std::map< std::string, QueryResult >::iterator gi = r.groups.begin(); + while(gi != r.groups.end()) { + QueryResult child = splitgroups(gi->second); + result.groups[gi->first] = child; + gi++; + } + + std::map< std::string, std::string >::iterator vi = r.values.begin(); + while(vi != r.values.end()) { + std::string name = vi->first; + + // Also insert in table with name containing '.'. + if(name.find(".") != std::string::npos) result.values[name] = vi->second; + + QueryResult *ncurrent = &result; + while(name.find(".") != std::string::npos) { + DEBUG(splitgroups, "value name: %s\n", name.c_str()); + QueryResult grp; + grp.timestamp = ncurrent->timestamp; + grp.source = ncurrent->source; + std::string grpname = name.substr(0, name.find(".")); + ncurrent->groups[grpname] = grp; + ncurrent = &(ncurrent->groups[grpname]); + name = name.substr(name.find(".") + 1); + } + ncurrent->values[name] = vi->second; + + vi++; + } + + return result; +} + + void LUAQueryMapper::addQueryResult(QueryResult &result) throw(Exception) { - loadResult(L, result); + // Check for '.' in names and further split up into groups. + QueryResult splitted = splitgroups(result); + + loadResult(L, splitted); clean_top = lua_gettop(L); } |