Browse Source

Added associated namespaces initialized by us.

views
Just Wonder 5 years ago
parent
commit
e22b05a951
  1. 8
      src/keva/common.cpp
  2. 4
      src/keva/common.h
  3. 50
      src/rpc/rpckeva_nonwallet.cpp

8
src/keva/common.cpp

@ -14,6 +14,8 @@
/* ************************************************************************** */ /* ************************************************************************** */
/* CKevaData. */ /* CKevaData. */
const std::string CKevaData::ASSOCIATE_PREFIX = "_g:";
void void
CKevaData::fromScript (unsigned h, const COutPoint& out, CKevaData::fromScript (unsigned h, const COutPoint& out,
const CKevaScript& script) const CKevaScript& script)
@ -192,8 +194,6 @@ bool CCacheKeyIterator::next(valtype& key, CKevaData& data)
/* ************************************************************************** */ /* ************************************************************************** */
/* CKevaCache. */ /* CKevaCache. */
const std::string CKevaCache::associatePrefix = "_g:";
bool bool
CKevaCache::get(const valtype& nameSpace, const valtype& key, CKevaData& data) const CKevaCache::get(const valtype& nameSpace, const valtype& key, CKevaData& data) const
{ {
@ -250,10 +250,10 @@ bool
CKevaCache::getAssociateNamespaces(const valtype& value, valtype& nameSpace) CKevaCache::getAssociateNamespaces(const valtype& value, valtype& nameSpace)
{ {
std::string valueStr = ValtypeToString(value); std::string valueStr = ValtypeToString(value);
if (valueStr.rfind(associatePrefix, 0) != 0) { if (valueStr.rfind(CKevaData::ASSOCIATE_PREFIX, 0) != 0) {
return false; return false;
} }
valueStr.erase(0, associatePrefix.length()); valueStr.erase(0, CKevaData::ASSOCIATE_PREFIX.length());
if (!DecodeKevaNamespace(valueStr, Params(), nameSpace)) { if (!DecodeKevaNamespace(valueStr, Params(), nameSpace)) {
return false; return false;
} }

4
src/keva/common.h

@ -56,6 +56,8 @@ ValtypeToString (const valtype& val)
*/ */
class CKevaData class CKevaData
{ {
public:
const static std::string ASSOCIATE_PREFIX;
private: private:
@ -298,8 +300,6 @@ class CKevaCache
private: private:
const static std::string associatePrefix;
/** /**
* Special comparator class for names that compares by length first. * Special comparator class for names that compares by length first.
* This is used to sort the cache entry map in the same way as the * This is used to sort the cache entry map in the same way as the

50
src/rpc/rpckeva_nonwallet.cpp

@ -418,6 +418,7 @@ UniValue keva_show_group(const JSONRPCRequest& request)
valtype nsDisplayKey = ValtypeFromString(CKevaScript::KEVA_DISPLAY_NAME_KEY); valtype nsDisplayKey = ValtypeFromString(CKevaScript::KEVA_DISPLAY_NAME_KEY);
std::unique_ptr<CKevaIterator> iter(pcoinsTip->IterateAssociatedNamespaces(nameSpace)); std::unique_ptr<CKevaIterator> iter(pcoinsTip->IterateAssociatedNamespaces(nameSpace));
// Find the namespace connection initialized by others.
while (iter->next(ns, data)) { while (iter->next(ns, data)) {
const int age = chainActive.Height() - data.getHeight(); const int age = chainActive.Height() - data.getHeight();
assert(age >= 0); assert(age >= 0);
@ -450,6 +451,55 @@ UniValue keva_show_group(const JSONRPCRequest& request)
} }
} }
// Find the namespace connection initialized by us.
std::unique_ptr<CKevaIterator> iterKeys(pcoinsTip->IterateKeys(nameSpace));
valtype targetNS;
valtype key;
while (iterKeys->next(key, data)) {
// Find the value with the format _g:NamespaceId
std::string keyStr = ValtypeToString(key);
if (keyStr.rfind(CKevaData::ASSOCIATE_PREFIX, 0) != 0) {
continue;
}
keyStr.erase(0, CKevaData::ASSOCIATE_PREFIX.length());
if (!DecodeKevaNamespace(keyStr, Params(), targetNS)) {
continue;
}
const int age = chainActive.Height() - data.getHeight();
assert(age >= 0);
if (maxage != 0 && age >= maxage) {
continue;
}
if (from > 0) {
--from;
continue;
}
assert(from == 0);
if (stats) {
++count;
}
else {
CKevaData nsData;
valtype nsName;
if (pcoinsTip->GetName(targetNS, nsDisplayKey, nsData)) {
nsName = nsData.getValue();
}
namespaces.push_back(getNamespaceInfo(targetNS, nsName, data.getUpdateOutpoint(),
data.getAddress(), data.getHeight(), false));
}
if (nb > 0) {
--nb;
if (nb == 0)
break;
}
}
if (stats) { if (stats) {
UniValue res(UniValue::VOBJ); UniValue res(UniValue::VOBJ);
res.pushKV("blocks", chainActive.Height()); res.pushKV("blocks", chainActive.Height());

Loading…
Cancel
Save