Browse Source

Fixed disassociation.

views
Just Wonder 5 years ago
parent
commit
64a6a1701e
  1. 6
      src/coins.cpp
  2. 37
      src/keva/common.cpp
  3. 6
      src/keva/common.h
  4. 5
      src/txdb.cpp

6
src/coins.cpp

@ -219,7 +219,7 @@ void CCoinsViewCache::SetName(const valtype &nameSpace, const valtype &key, cons @@ -219,7 +219,7 @@ void CCoinsViewCache::SetName(const valtype &nameSpace, const valtype &key, cons
// Handle namespace association.
valtype associdateNamespace;
if (!cacheNames.getAssociateNamespaces(data.getValue(), associdateNamespace)) {
if (!cacheNames.getAssociateNamespaces(key, associdateNamespace)) {
return;
}
@ -227,7 +227,7 @@ void CCoinsViewCache::SetName(const valtype &nameSpace, const valtype &key, cons @@ -227,7 +227,7 @@ void CCoinsViewCache::SetName(const valtype &nameSpace, const valtype &key, cons
if (!GetNamespace(associdateNamespace, dummyData)) {
return;
}
cacheNames.associateNamespaces(nameSpace, associdateNamespace);
cacheNames.associateNamespaces(nameSpace, associdateNamespace, data);
}
void CCoinsViewCache::DeleteName(const valtype &nameSpace, const valtype &key) {
@ -239,7 +239,7 @@ void CCoinsViewCache::DeleteName(const valtype &nameSpace, const valtype &key) { @@ -239,7 +239,7 @@ void CCoinsViewCache::DeleteName(const valtype &nameSpace, const valtype &key) {
// Handle namespace association.
valtype associdateNamespace;
if (!cacheNames.getAssociateNamespaces(oldData.getValue(), associdateNamespace)) {
if (!cacheNames.getAssociateNamespaces(key, associdateNamespace)) {
return;
}

37
src/keva/common.cpp

@ -186,7 +186,7 @@ bool CCacheKeyIterator::next(valtype& key, CKevaData& data) @@ -186,7 +186,7 @@ bool CCacheKeyIterator::next(valtype& key, CKevaData& data)
/* ************************************************************************** */
/* CKevaCache. */
const std::string CKevaCache::associatePrefix = "_A_";
const std::string CKevaCache::associatePrefix = "_f:";
bool
CKevaCache::get(const valtype& nameSpace, const valtype& key, CKevaData& data) const
@ -215,6 +215,8 @@ void @@ -215,6 +215,8 @@ void
CKevaCache::set(const valtype& nameSpace, const valtype& key, const CKevaData& data)
{
auto name = std::make_tuple(nameSpace, key);
printf("set name is: %s\n", (EncodeBase58Check(nameSpace) + ValtypeToString(key)).c_str());
printf("set, this is: %p, data value is: %s\n", this, ValtypeToString(data.getValue()).c_str());
const std::set<NamespaceKeyType>::iterator di = deleted.find(name);
if (di != deleted.end()) {
deleted.erase(di);
@ -255,25 +257,39 @@ CKevaCache::getAssociateNamespaces(const valtype& value, valtype& nameSpace) @@ -255,25 +257,39 @@ CKevaCache::getAssociateNamespaces(const valtype& value, valtype& nameSpace)
}
void
CKevaCache::associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther)
CKevaCache::associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther, const CKevaData& data)
{
auto name = std::make_tuple(nameSpaceOther, nameSpace);
printf("associateNamespaces, name is: %s\n", (EncodeBase58Check(nameSpaceOther) + EncodeBase58Check(nameSpace)).c_str());
printf("associateNamespaces, this is: %p, data value is: %s\n", this, ValtypeToString(data.getValue()).c_str());
const std::set<NamespaceKeyType>::iterator di = disassociations.find(name);
if (di != disassociations.end()) {
disassociations.erase(di);
}
const NamespaceMap::iterator ei = associations.find(name);
CKevaData data;
if (ei != entries.end())
if (ei != associations.end()) {
printf("CKevaCache::associateNamespaces, REPLACE !!!\n");
ei->second = data;
else
} else {
printf("CKevaCache::associateNamespaces, INSERT !!!\n");
associations.insert(std::make_pair(name, data));
}
}
void
CKevaCache::disassociateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther)
{
auto name = std::make_tuple(nameSpaceOther, nameSpace);
const NamespaceMap::iterator ei = entries.find(name);
if (ei != entries.end()) {
const NamespaceMap::iterator ei = associations.find(name);
printf("CKevaCache::disassociateNamespaces, name is: %s\n", (EncodeBase58Check(nameSpaceOther) + EncodeBase58Check(nameSpace)).c_str());
if (ei != associations.end()) {
printf("CKevaCache::disassociateNamespaces, erase!!!\n");
associations.erase(ei);
}
disassociations.insert(name);
}
CKevaIterator*
@ -298,15 +314,20 @@ CKevaCache::updateNamesForHeight (unsigned nHeight, @@ -298,15 +314,20 @@ CKevaCache::updateNamesForHeight (unsigned nHeight,
void CKevaCache::apply(const CKevaCache& cache)
{
printf("CKevaCache::apply!!!!\n");
for (EntryMap::const_iterator i = cache.entries.begin(); i != cache.entries.end(); ++i) {
set(std::get<0>(i->first), std::get<1>(i->first), i->second);
}
for (NamespaceMap::const_iterator i = associations.begin(); i != associations.end(); ++i) {
set(std::get<0>(i->first), std::get<1>(i->first), i->second);
associateNamespaces(std::get<0>(i->first), std::get<1>(i->first), i->second);
}
for (std::set<NamespaceKeyType>::const_iterator i = cache.deleted.begin(); i != cache.deleted.end(); ++i) {
remove(std::get<0>(*i), std::get<1>(*i));
}
for (std::set<NamespaceKeyType>::const_iterator i = cache.disassociations.begin(); i != cache.disassociations.end(); ++i) {
disassociateNamespaces(std::get<0>(*i), std::get<1>(*i));
}
}

6
src/keva/common.h

@ -351,6 +351,9 @@ private: @@ -351,6 +351,9 @@ private:
/** Namespace association. */
NamespaceMap associations;
/** Namespace disassociations. */
std::set<NamespaceKeyType> disassociations;
friend class CCacheKeyIterator;
public:
@ -361,6 +364,7 @@ public: @@ -361,6 +364,7 @@ public:
entries.clear();
deleted.clear();
associations.clear();
disassociations.clear();
}
/**
@ -406,7 +410,7 @@ public: @@ -406,7 +410,7 @@ public:
bool getAssociateNamespaces(const valtype& value, valtype& nameSpace);
/* Associate nameSpace with nameSpaceOther */
void associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther);
void associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther, const CKevaData& data);
/* Disassociate nameSpace with nameSpaceOther */
void disassociateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther);

5
src/txdb.cpp

@ -343,6 +343,11 @@ void CKevaCache::writeBatch (CDBBatch& batch) const @@ -343,6 +343,11 @@ void CKevaCache::writeBatch (CDBBatch& batch) const
std::pair<valtype, valtype> name = std::make_pair(std::get<0>(*i), std::get<1>(*i));
batch.Erase(std::make_pair(DB_NAME, name));
}
for (std::set<NamespaceKeyType>::const_iterator i = disassociations.begin(); i != disassociations.end(); ++i) {
std::pair<valtype, valtype> name = std::make_pair(std::get<0>(*i), std::get<1>(*i));
batch.Erase(std::make_pair(DB_NS_ASSOC, name));
}
}
bool CBlockTreeDB::ReadTxIndex(const uint256 &txid, CDiskTxPos &pos) {

Loading…
Cancel
Save