Initial commit
This commit is contained in:
104
ZUtil/ZRegistry.cpp
Normal file
104
ZUtil/ZRegistry.cpp
Normal file
@@ -0,0 +1,104 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user