Files
libsst/ZUtil/ZRegistry.cpp
2026-04-03 00:22:39 -05:00

105 lines
2.1 KiB
C++

#include <ZUtil/ZRegistry.hpp>
/*************************************************************************/
ZRegistry::ZRegistry()
: Lock(), Tree()
{
}
/*************************************************************************/
ZRegistry::ZRegistry( const ZKVTree& _tree )
: Lock(), Tree(_tree)
{
}
/*************************************************************************/
ZRegistry::~ZRegistry()
{
}
/*************************************************************************/
void ZRegistry::Erase( const ZString& _key )
{
Lock.LockForWriting(SST_WAIT_INFINITE);
ZKVTree::Iterator itr = Tree.Find(_key);
if (itr != Tree.End()) {
Tree.Erase(itr);
}
Lock.EndWriting();
}
/*************************************************************************/
const ZRegistry::Value ZRegistry::Get( const ZString& _key ) const
{
Lock.LockForReading(SST_WAIT_INFINITE);
ZKVTree::Iterator itr = Tree.Find(_key);
if (itr != Tree.End()) {
ZRegistry::Value val(itr.GetValue(), true);
Lock.EndReading();
return val;
}
Lock.EndReading();
return ZRegistry::Value("", false);
}
/*************************************************************************/
bool ZRegistry::Put( const ZString& _key, const ZString& _value )
{
size_t i = _key.Length();
//ZRegistry does not support sibling nodes with the same name
if (ZStringAlgo::FindFirstOf(_key, "[]") != ZSTL::InvalidPos)
return false;
Lock.LockForWriting(SST_WAIT_INFINITE);
/*
NOTE: This algorithm is not currently needed with the way ZKVTree works, but
that may change - placing value-less nodes in KV tree may be incorrect. If that
changes, this should work.
Algorithm:
attempt to place full key
if it succeeds, return true
else
while (valid path)
attempt key - child (i.e., A.B.C.d -> A.B.C, A.B.C -> A.B, A.B -> A, A -> '')
if success, attempt full key
else repeat
*/
while (i > 0) {
Tree.Put(ZString(_key, 0, i), _value);
if (i == _key.Length()) {
break;
} else {
i = _key.Length();
}
i = ZStringAlgo::FindLast(_key, ZKVTREE_PATH_SEPARATOR, 0, i);
if (i == ZSTL::InvalidPos)
break;
}
Lock.EndWriting();
return i > 0;
}