diff --git a/doc/20-library-reference.md b/doc/20-library-reference.md index b3ed5b8de..22e695040 100644 --- a/doc/20-library-reference.md +++ b/doc/20-library-reference.md @@ -633,6 +633,14 @@ Signature: Retrieves the value for the specified `key`. Returns `null` if they `key` does not exist in the dictionary. +### Dictionary#keys + +Signature: + + function keys(); + +Returns a list of keys for all items that are currently in the dictionary. + ## Function type ### Function#call diff --git a/lib/base/dictionary-script.cpp b/lib/base/dictionary-script.cpp index b10be389d..e2a3aa227 100644 --- a/lib/base/dictionary-script.cpp +++ b/lib/base/dictionary-script.cpp @@ -21,6 +21,9 @@ #include "base/function.hpp" #include "base/functionwrapper.hpp" #include "base/scriptframe.hpp" +#include "base/array.hpp" +#include "base/objectlock.hpp" +#include using namespace icinga; @@ -66,6 +69,18 @@ static Dictionary::Ptr DictionaryClone(void) return self->ShallowClone(); } +static Array::Ptr DictionaryKeys(void) +{ + ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); + Dictionary::Ptr self = static_cast(vframe->Self); + Array::Ptr keys = new Array(); + ObjectLock olock(self); + BOOST_FOREACH(const Dictionary::Pair& kv, self) { + keys->Add(kv.first); + } + return keys; +} + Object::Ptr Dictionary::GetPrototype(void) { static Dictionary::Ptr prototype; @@ -78,6 +93,7 @@ Object::Ptr Dictionary::GetPrototype(void) prototype->Set("remove", new Function(WrapFunction(DictionaryRemove))); prototype->Set("contains", new Function(WrapFunction(DictionaryContains))); prototype->Set("clone", new Function(WrapFunction(DictionaryClone))); + prototype->Set("keys", new Function(WrapFunction(DictionaryKeys))); } return prototype;