Gavin Andresen's JSON-RPC HTTP authentication,
[novacoin.git] / db.cpp
diff --git a/db.cpp b/db.cpp
index 0e02e96..ea0b581 100644 (file)
--- a/db.cpp
+++ b/db.cpp
@@ -130,7 +130,14 @@ void CDB::Close()
         vTxn.front()->abort();\r
     vTxn.clear();\r
     pdb = NULL;\r
-    dbenv.txn_checkpoint(0, 0, 0);\r
+\r
+    // Flush database activity from memory pool to disk log\r
+    unsigned int nMinutes = 0;\r
+    if (strFile == "addr.dat")\r
+        nMinutes = 2;\r
+    if (strFile == "blkindex.dat" && IsInitialBlockDownload() && nBestHeight % 500 != 0)\r
+        nMinutes = 1;\r
+    dbenv.txn_checkpoint(0, nMinutes, 0);\r
 \r
     CRITICAL_BLOCK(cs_db)\r
         --mapFileUseCount[strFile];\r
@@ -357,11 +364,12 @@ CBlockIndex* InsertBlockIndex(uint256 hash)
 \r
 bool CTxDB::LoadBlockIndex()\r
 {\r
-    // Get cursor\r
+    // Get database cursor\r
     Dbc* pcursor = GetCursor();\r
     if (!pcursor)\r
         return false;\r
 \r
+    // Load mapBlockIndex\r
     unsigned int fFlags = DB_SET_RANGE;\r
     loop\r
     {\r
@@ -398,7 +406,7 @@ bool CTxDB::LoadBlockIndex()
             pindexNew->nBits          = diskindex.nBits;\r
             pindexNew->nNonce         = diskindex.nNonce;\r
 \r
-            // Watch for genesis block and best block\r
+            // Watch for genesis block\r
             if (pindexGenesisBlock == NULL && diskindex.GetBlockHash() == hashGenesisBlock)\r
                 pindexGenesisBlock = pindexNew;\r
         }\r
@@ -409,17 +417,33 @@ bool CTxDB::LoadBlockIndex()
     }\r
     pcursor->close();\r
 \r
+    // Calculate bnChainWork\r
+    vector<pair<int, CBlockIndex*> > vSortedByHeight;\r
+    vSortedByHeight.reserve(mapBlockIndex.size());\r
+    foreach(const PAIRTYPE(uint256, CBlockIndex*)& item, mapBlockIndex)\r
+    {\r
+        CBlockIndex* pindex = item.second;\r
+        vSortedByHeight.push_back(make_pair(pindex->nHeight, pindex));\r
+    }\r
+    sort(vSortedByHeight.begin(), vSortedByHeight.end());\r
+    foreach(const PAIRTYPE(int, CBlockIndex*)& item, vSortedByHeight)\r
+    {\r
+        CBlockIndex* pindex = item.second;\r
+        pindex->bnChainWork = (pindex->pprev ? pindex->pprev->bnChainWork : 0) + pindex->GetBlockWork();\r
+    }\r
+\r
+    // Load hashBestChain pointer to end of best chain\r
     if (!ReadHashBestChain(hashBestChain))\r
     {\r
         if (pindexGenesisBlock == NULL)\r
             return true;\r
-        return error("CTxDB::LoadBlockIndex() : hashBestChain not found");\r
+        return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded");\r
     }\r
-\r
     if (!mapBlockIndex.count(hashBestChain))\r
-        return error("CTxDB::LoadBlockIndex() : blockindex for hashBestChain not found");\r
+        return error("CTxDB::LoadBlockIndex() : hashBestChain not found in the block index");\r
     pindexBest = mapBlockIndex[hashBestChain];\r
     nBestHeight = pindexBest->nHeight;\r
+    bnBestChainWork = pindexBest->bnChainWork;\r
     printf("LoadBlockIndex(): hashBestChain=%s  height=%d\n", hashBestChain.ToString().substr(0,16).c_str(), nBestHeight);\r
 \r
     return true;\r