diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2012-03-22 09:19:01 -0400 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2012-03-22 09:19:01 -0400 |
commit | a6b4a11385bf44e695c3e47cbd0de6e40eea0b23 (patch) | |
tree | cf0388fcb5169c85b495092e09be6af5a886a236 /src/db.cpp | |
parent | 0e894be626ae15f26f6f1483b38c7e9191bdb638 (diff) | |
parent | 5fee401fe14aa6459428a26a82f764db70a6a0b9 (diff) |
Merge branch 'addrman' of https://github.com/sipa/bitcoin
Diffstat (limited to 'src/db.cpp')
-rw-r--r-- | src/db.cpp | 71 |
1 files changed, 48 insertions, 23 deletions
diff --git a/src/db.cpp b/src/db.cpp index 7c3937a49f..3bdfd64556 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -624,44 +624,65 @@ bool CAddrDB::WriteAddress(const CAddress& addr) return Write(make_pair(string("addr"), addr.GetKey()), addr); } +bool CAddrDB::WriteAddrman(const CAddrMan& addrman) +{ + return Write(string("addrman"), addrman); +} + bool CAddrDB::EraseAddress(const CAddress& addr) { return Erase(make_pair(string("addr"), addr.GetKey())); } -bool CAddrDB::LoadAddresses() +bool CAddrDB::LoadAddresses(bool &fUpdate) { - CRITICAL_BLOCK(cs_mapAddresses) + bool fAddrMan = false; + if (Read(string("addrman"), addrman)) { - // Get cursor - Dbc* pcursor = GetCursor(); - if (!pcursor) + printf("Loaded %i addresses\n", addrman.size()); + fAddrMan = true; + } + + vector<CAddress> vAddr; + + // Get cursor + Dbc* pcursor = GetCursor(); + if (!pcursor) + return false; + + loop + { + // Read next record + CDataStream ssKey; + CDataStream ssValue; + int ret = ReadAtCursor(pcursor, ssKey, ssValue); + if (ret == DB_NOTFOUND) + break; + else if (ret != 0) return false; - loop + // Unserialize + string strType; + ssKey >> strType; + if (strType == "addr") { - // Read next record - CDataStream ssKey; - CDataStream ssValue; - int ret = ReadAtCursor(pcursor, ssKey, ssValue); - if (ret == DB_NOTFOUND) - break; - else if (ret != 0) - return false; - - // Unserialize - string strType; - ssKey >> strType; - if (strType == "addr") + if (fAddrMan) + fUpdate = true; + else { CAddress addr; ssValue >> addr; - mapAddresses.insert(make_pair(addr.GetKey(), addr)); + vAddr.push_back(addr); } + } - pcursor->close(); + } + pcursor->close(); - printf("Loaded %d addresses\n", mapAddresses.size()); + if (!fAddrMan) + { + addrman.Add(vAddr, CNetAddr("0.0.0.0")); + printf("Loaded %i addresses\n", addrman.size()); } return true; @@ -669,7 +690,11 @@ bool CAddrDB::LoadAddresses() bool LoadAddresses() { - return CAddrDB("cr+").LoadAddresses(); + bool fUpdate = false; + bool fRet = CAddrDB("cr+").LoadAddresses(fUpdate); + if (fUpdate) + CDB::Rewrite("addr.dat", "\004addr"); + return fRet; } |