aboutsummaryrefslogtreecommitdiff
path: root/src/db.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2012-03-22 09:19:01 -0400
committerGavin Andresen <gavinandresen@gmail.com>2012-03-22 09:19:01 -0400
commita6b4a11385bf44e695c3e47cbd0de6e40eea0b23 (patch)
treecf0388fcb5169c85b495092e09be6af5a886a236 /src/db.cpp
parent0e894be626ae15f26f6f1483b38c7e9191bdb638 (diff)
parent5fee401fe14aa6459428a26a82f764db70a6a0b9 (diff)
downloadbitcoin-a6b4a11385bf44e695c3e47cbd0de6e40eea0b23.tar.xz
Merge branch 'addrman' of https://github.com/sipa/bitcoin
Diffstat (limited to 'src/db.cpp')
-rw-r--r--src/db.cpp71
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;
}