Split CWallet::AddToWallet into AddToWallet and LoadToWallet.
This removes the fFromLoadWallet flag in AddToWallet. These were already effectively two methods.
This commit is contained in:
parent
bbcb8fd884
commit
00f09c920c
5 changed files with 127 additions and 124 deletions
|
@ -310,7 +310,7 @@ UniValue importprunedfunds(const UniValue& params, bool fHelp)
|
||||||
|
|
||||||
if (pwalletMain->IsMine(tx)) {
|
if (pwalletMain->IsMine(tx)) {
|
||||||
CWalletDB walletdb(pwalletMain->strWalletFile, "r+", false);
|
CWalletDB walletdb(pwalletMain->strWalletFile, "r+", false);
|
||||||
pwalletMain->AddToWallet(wtx, false, &walletdb);
|
pwalletMain->AddToWallet(wtx, &walletdb);
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
|
||||||
pwalletMain->AddAccountingEntry(ae, walletdb);
|
pwalletMain->AddAccountingEntry(ae, walletdb);
|
||||||
|
|
||||||
wtx.mapValue["comment"] = "z";
|
wtx.mapValue["comment"] = "z";
|
||||||
pwalletMain->AddToWallet(wtx, false, &walletdb);
|
pwalletMain->AddToWallet(wtx, &walletdb);
|
||||||
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
|
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
|
||||||
vpwtx[0]->nTimeReceived = (unsigned int)1333333335;
|
vpwtx[0]->nTimeReceived = (unsigned int)1333333335;
|
||||||
vpwtx[0]->nOrderPos = -1;
|
vpwtx[0]->nOrderPos = -1;
|
||||||
|
@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
|
||||||
--tx.nLockTime; // Just to change the hash :)
|
--tx.nLockTime; // Just to change the hash :)
|
||||||
*static_cast<CTransaction*>(&wtx) = CTransaction(tx);
|
*static_cast<CTransaction*>(&wtx) = CTransaction(tx);
|
||||||
}
|
}
|
||||||
pwalletMain->AddToWallet(wtx, false, &walletdb);
|
pwalletMain->AddToWallet(wtx, &walletdb);
|
||||||
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
|
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
|
||||||
vpwtx[1]->nTimeReceived = (unsigned int)1333333336;
|
vpwtx[1]->nTimeReceived = (unsigned int)1333333336;
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
|
||||||
--tx.nLockTime; // Just to change the hash :)
|
--tx.nLockTime; // Just to change the hash :)
|
||||||
*static_cast<CTransaction*>(&wtx) = CTransaction(tx);
|
*static_cast<CTransaction*>(&wtx) = CTransaction(tx);
|
||||||
}
|
}
|
||||||
pwalletMain->AddToWallet(wtx, false, &walletdb);
|
pwalletMain->AddToWallet(wtx, &walletdb);
|
||||||
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
|
vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
|
||||||
vpwtx[2]->nTimeReceived = (unsigned int)1333333329;
|
vpwtx[2]->nTimeReceived = (unsigned int)1333333329;
|
||||||
vpwtx[2]->nOrderPos = -1;
|
vpwtx[2]->nOrderPos = -1;
|
||||||
|
|
|
@ -741,138 +741,140 @@ void CWallet::MarkDirty()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletDB* pwalletdb)
|
bool CWallet::AddToWallet(const CWalletTx& wtxIn, CWalletDB* pwalletdb)
|
||||||
{
|
{
|
||||||
uint256 hash = wtxIn.GetHash();
|
uint256 hash = wtxIn.GetHash();
|
||||||
|
|
||||||
if (fFromLoadWallet)
|
LOCK(cs_wallet);
|
||||||
|
// Inserts only if not already there, returns tx inserted or tx found
|
||||||
|
pair<map<uint256, CWalletTx>::iterator, bool> ret = mapWallet.insert(make_pair(hash, wtxIn));
|
||||||
|
CWalletTx& wtx = (*ret.first).second;
|
||||||
|
wtx.BindWallet(this);
|
||||||
|
bool fInsertedNew = ret.second;
|
||||||
|
if (fInsertedNew)
|
||||||
{
|
{
|
||||||
mapWallet[hash] = wtxIn;
|
wtx.nTimeReceived = GetAdjustedTime();
|
||||||
CWalletTx& wtx = mapWallet[hash];
|
wtx.nOrderPos = IncOrderPosNext(pwalletdb);
|
||||||
wtx.BindWallet(this);
|
|
||||||
wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
|
wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
|
||||||
AddToSpends(hash);
|
|
||||||
BOOST_FOREACH(const CTxIn& txin, wtx.vin) {
|
|
||||||
if (mapWallet.count(txin.prevout.hash)) {
|
|
||||||
CWalletTx& prevtx = mapWallet[txin.prevout.hash];
|
|
||||||
if (prevtx.nIndex == -1 && !prevtx.hashUnset()) {
|
|
||||||
MarkConflicted(prevtx.hashBlock, wtx.GetHash());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOCK(cs_wallet);
|
|
||||||
// Inserts only if not already there, returns tx inserted or tx found
|
|
||||||
pair<map<uint256, CWalletTx>::iterator, bool> ret = mapWallet.insert(make_pair(hash, wtxIn));
|
|
||||||
CWalletTx& wtx = (*ret.first).second;
|
|
||||||
wtx.BindWallet(this);
|
|
||||||
bool fInsertedNew = ret.second;
|
|
||||||
if (fInsertedNew)
|
|
||||||
{
|
|
||||||
wtx.nTimeReceived = GetAdjustedTime();
|
|
||||||
wtx.nOrderPos = IncOrderPosNext(pwalletdb);
|
|
||||||
wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
|
|
||||||
|
|
||||||
wtx.nTimeSmart = wtx.nTimeReceived;
|
wtx.nTimeSmart = wtx.nTimeReceived;
|
||||||
if (!wtxIn.hashUnset())
|
if (!wtxIn.hashUnset())
|
||||||
|
{
|
||||||
|
if (mapBlockIndex.count(wtxIn.hashBlock))
|
||||||
{
|
{
|
||||||
if (mapBlockIndex.count(wtxIn.hashBlock))
|
int64_t latestNow = wtx.nTimeReceived;
|
||||||
|
int64_t latestEntry = 0;
|
||||||
{
|
{
|
||||||
int64_t latestNow = wtx.nTimeReceived;
|
// Tolerate times up to the last timestamp in the wallet not more than 5 minutes into the future
|
||||||
int64_t latestEntry = 0;
|
int64_t latestTolerated = latestNow + 300;
|
||||||
|
const TxItems & txOrdered = wtxOrdered;
|
||||||
|
for (TxItems::const_reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it)
|
||||||
{
|
{
|
||||||
// Tolerate times up to the last timestamp in the wallet not more than 5 minutes into the future
|
CWalletTx *const pwtx = (*it).second.first;
|
||||||
int64_t latestTolerated = latestNow + 300;
|
if (pwtx == &wtx)
|
||||||
const TxItems & txOrdered = wtxOrdered;
|
continue;
|
||||||
for (TxItems::const_reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it)
|
CAccountingEntry *const pacentry = (*it).second.second;
|
||||||
|
int64_t nSmartTime;
|
||||||
|
if (pwtx)
|
||||||
{
|
{
|
||||||
CWalletTx *const pwtx = (*it).second.first;
|
nSmartTime = pwtx->nTimeSmart;
|
||||||
if (pwtx == &wtx)
|
if (!nSmartTime)
|
||||||
continue;
|
nSmartTime = pwtx->nTimeReceived;
|
||||||
CAccountingEntry *const pacentry = (*it).second.second;
|
}
|
||||||
int64_t nSmartTime;
|
else
|
||||||
if (pwtx)
|
nSmartTime = pacentry->nTime;
|
||||||
{
|
if (nSmartTime <= latestTolerated)
|
||||||
nSmartTime = pwtx->nTimeSmart;
|
{
|
||||||
if (!nSmartTime)
|
latestEntry = nSmartTime;
|
||||||
nSmartTime = pwtx->nTimeReceived;
|
if (nSmartTime > latestNow)
|
||||||
}
|
latestNow = nSmartTime;
|
||||||
else
|
break;
|
||||||
nSmartTime = pacentry->nTime;
|
|
||||||
if (nSmartTime <= latestTolerated)
|
|
||||||
{
|
|
||||||
latestEntry = nSmartTime;
|
|
||||||
if (nSmartTime > latestNow)
|
|
||||||
latestNow = nSmartTime;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t blocktime = mapBlockIndex[wtxIn.hashBlock]->GetBlockTime();
|
|
||||||
wtx.nTimeSmart = std::max(latestEntry, std::min(blocktime, latestNow));
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
LogPrintf("AddToWallet(): found %s in block %s not in index\n",
|
int64_t blocktime = mapBlockIndex[wtxIn.hashBlock]->GetBlockTime();
|
||||||
wtxIn.GetHash().ToString(),
|
wtx.nTimeSmart = std::max(latestEntry, std::min(blocktime, latestNow));
|
||||||
wtxIn.hashBlock.ToString());
|
|
||||||
}
|
}
|
||||||
AddToSpends(hash);
|
else
|
||||||
|
LogPrintf("AddToWallet(): found %s in block %s not in index\n",
|
||||||
|
wtxIn.GetHash().ToString(),
|
||||||
|
wtxIn.hashBlock.ToString());
|
||||||
}
|
}
|
||||||
|
AddToSpends(hash);
|
||||||
bool fUpdated = false;
|
|
||||||
if (!fInsertedNew)
|
|
||||||
{
|
|
||||||
// Merge
|
|
||||||
if (!wtxIn.hashUnset() && wtxIn.hashBlock != wtx.hashBlock)
|
|
||||||
{
|
|
||||||
wtx.hashBlock = wtxIn.hashBlock;
|
|
||||||
fUpdated = true;
|
|
||||||
}
|
|
||||||
// If no longer abandoned, update
|
|
||||||
if (wtxIn.hashBlock.IsNull() && wtx.isAbandoned())
|
|
||||||
{
|
|
||||||
wtx.hashBlock = wtxIn.hashBlock;
|
|
||||||
fUpdated = true;
|
|
||||||
}
|
|
||||||
if (wtxIn.nIndex != -1 && (wtxIn.nIndex != wtx.nIndex))
|
|
||||||
{
|
|
||||||
wtx.nIndex = wtxIn.nIndex;
|
|
||||||
fUpdated = true;
|
|
||||||
}
|
|
||||||
if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe)
|
|
||||||
{
|
|
||||||
wtx.fFromMe = wtxIn.fFromMe;
|
|
||||||
fUpdated = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//// debug print
|
|
||||||
LogPrintf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
|
|
||||||
|
|
||||||
// Write to disk
|
|
||||||
if (fInsertedNew || fUpdated)
|
|
||||||
if (!pwalletdb->WriteTx(wtx))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Break debit/credit balance caches:
|
|
||||||
wtx.MarkDirty();
|
|
||||||
|
|
||||||
// Notify UI of new or updated transaction
|
|
||||||
NotifyTransactionChanged(this, hash, fInsertedNew ? CT_NEW : CT_UPDATED);
|
|
||||||
|
|
||||||
// notify an external script when a wallet transaction comes in or is updated
|
|
||||||
std::string strCmd = GetArg("-walletnotify", "");
|
|
||||||
|
|
||||||
if ( !strCmd.empty())
|
|
||||||
{
|
|
||||||
boost::replace_all(strCmd, "%s", wtxIn.GetHash().GetHex());
|
|
||||||
boost::thread t(runCommand, strCmd); // thread runs free
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool fUpdated = false;
|
||||||
|
if (!fInsertedNew)
|
||||||
|
{
|
||||||
|
// Merge
|
||||||
|
if (!wtxIn.hashUnset() && wtxIn.hashBlock != wtx.hashBlock)
|
||||||
|
{
|
||||||
|
wtx.hashBlock = wtxIn.hashBlock;
|
||||||
|
fUpdated = true;
|
||||||
|
}
|
||||||
|
// If no longer abandoned, update
|
||||||
|
if (wtxIn.hashBlock.IsNull() && wtx.isAbandoned())
|
||||||
|
{
|
||||||
|
wtx.hashBlock = wtxIn.hashBlock;
|
||||||
|
fUpdated = true;
|
||||||
|
}
|
||||||
|
if (wtxIn.nIndex != -1 && (wtxIn.nIndex != wtx.nIndex))
|
||||||
|
{
|
||||||
|
wtx.nIndex = wtxIn.nIndex;
|
||||||
|
fUpdated = true;
|
||||||
|
}
|
||||||
|
if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe)
|
||||||
|
{
|
||||||
|
wtx.fFromMe = wtxIn.fFromMe;
|
||||||
|
fUpdated = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//// debug print
|
||||||
|
LogPrintf("AddToWallet %s %s%s\n", wtxIn.GetHash().ToString(), (fInsertedNew ? "new" : ""), (fUpdated ? "update" : ""));
|
||||||
|
|
||||||
|
// Write to disk
|
||||||
|
if (fInsertedNew || fUpdated)
|
||||||
|
if (!pwalletdb->WriteTx(wtx))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Break debit/credit balance caches:
|
||||||
|
wtx.MarkDirty();
|
||||||
|
|
||||||
|
// Notify UI of new or updated transaction
|
||||||
|
NotifyTransactionChanged(this, hash, fInsertedNew ? CT_NEW : CT_UPDATED);
|
||||||
|
|
||||||
|
// notify an external script when a wallet transaction comes in or is updated
|
||||||
|
std::string strCmd = GetArg("-walletnotify", "");
|
||||||
|
|
||||||
|
if ( !strCmd.empty())
|
||||||
|
{
|
||||||
|
boost::replace_all(strCmd, "%s", wtxIn.GetHash().GetHex());
|
||||||
|
boost::thread t(runCommand, strCmd); // thread runs free
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CWallet::LoadToWallet(const CWalletTx& wtxIn)
|
||||||
|
{
|
||||||
|
uint256 hash = wtxIn.GetHash();
|
||||||
|
|
||||||
|
mapWallet[hash] = wtxIn;
|
||||||
|
CWalletTx& wtx = mapWallet[hash];
|
||||||
|
wtx.BindWallet(this);
|
||||||
|
wtxOrdered.insert(make_pair(wtx.nOrderPos, TxPair(&wtx, (CAccountingEntry*)0)));
|
||||||
|
AddToSpends(hash);
|
||||||
|
BOOST_FOREACH(const CTxIn& txin, wtx.vin) {
|
||||||
|
if (mapWallet.count(txin.prevout.hash)) {
|
||||||
|
CWalletTx& prevtx = mapWallet[txin.prevout.hash];
|
||||||
|
if (prevtx.nIndex == -1 && !prevtx.hashUnset()) {
|
||||||
|
MarkConflicted(prevtx.hashBlock, wtx.GetHash());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -913,7 +915,7 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pbl
|
||||||
// this is safe, as in case of a crash, we rescan the necessary blocks on startup through our SetBestChain-mechanism
|
// this is safe, as in case of a crash, we rescan the necessary blocks on startup through our SetBestChain-mechanism
|
||||||
CWalletDB walletdb(strWalletFile, "r+", false);
|
CWalletDB walletdb(strWalletFile, "r+", false);
|
||||||
|
|
||||||
return AddToWallet(wtx, false, &walletdb);
|
return AddToWallet(wtx, &walletdb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -2456,7 +2458,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
|
||||||
|
|
||||||
// Add tx to wallet, because if it has change it's also ours,
|
// Add tx to wallet, because if it has change it's also ours,
|
||||||
// otherwise just for transaction history.
|
// otherwise just for transaction history.
|
||||||
AddToWallet(wtxNew, false, pwalletdb);
|
AddToWallet(wtxNew, pwalletdb);
|
||||||
|
|
||||||
// Notify that old coins are spent
|
// Notify that old coins are spent
|
||||||
set<CWalletTx*> setCoins;
|
set<CWalletTx*> setCoins;
|
||||||
|
|
|
@ -729,7 +729,8 @@ public:
|
||||||
bool GetAccountPubkey(CPubKey &pubKey, std::string strAccount, bool bForceNew = false);
|
bool GetAccountPubkey(CPubKey &pubKey, std::string strAccount, bool bForceNew = false);
|
||||||
|
|
||||||
void MarkDirty();
|
void MarkDirty();
|
||||||
bool AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletDB* pwalletdb);
|
bool AddToWallet(const CWalletTx& wtxIn, CWalletDB* pwalletdb);
|
||||||
|
bool LoadToWallet(const CWalletTx& wtxIn);
|
||||||
void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, const CBlock* pblock);
|
void SyncTransaction(const CTransaction& tx, const CBlockIndex *pindex, const CBlock* pblock);
|
||||||
bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate);
|
bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate);
|
||||||
int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false);
|
int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false);
|
||||||
|
|
|
@ -400,7 +400,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
|
||||||
if (wtx.nOrderPos == -1)
|
if (wtx.nOrderPos == -1)
|
||||||
wss.fAnyUnordered = true;
|
wss.fAnyUnordered = true;
|
||||||
|
|
||||||
pwallet->AddToWallet(wtx, true, NULL);
|
pwallet->LoadToWallet(wtx);
|
||||||
}
|
}
|
||||||
else if (strType == "acentry")
|
else if (strType == "acentry")
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue