Bugfix: Initialize CWallet::nOrderPosNext on an empty wallet, and save it in db

This commit is contained in:
Luke Dashjr 2012-09-08 04:55:36 +00:00
parent ddb709e9de
commit da7b8c1260
6 changed files with 28 additions and 4 deletions

View File

@ -544,7 +544,7 @@ Value movecmd(const Array& params, bool fHelp)
// Debit // Debit
CAccountingEntry debit; CAccountingEntry debit;
debit.nOrderPos = pwalletMain->nOrderPosNext++; debit.nOrderPos = pwalletMain->IncOrderPosNext();
debit.strAccount = strFrom; debit.strAccount = strFrom;
debit.nCreditDebit = -nAmount; debit.nCreditDebit = -nAmount;
debit.nTime = nNow; debit.nTime = nNow;
@ -554,7 +554,7 @@ Value movecmd(const Array& params, bool fHelp)
// Credit // Credit
CAccountingEntry credit; CAccountingEntry credit;
credit.nOrderPos = pwalletMain->nOrderPosNext++; credit.nOrderPos = pwalletMain->IncOrderPosNext();
credit.strAccount = strTo; credit.strAccount = strTo;
credit.nCreditDebit = nAmount; credit.nCreditDebit = nAmount;
credit.nTime = nNow; credit.nTime = nNow;

View File

@ -60,7 +60,7 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
ae.nTime = 1333333330; ae.nTime = 1333333330;
ae.strOtherAccount = "d"; ae.strOtherAccount = "d";
ae.nOrderPos = pwalletMain->nOrderPosNext++; ae.nOrderPos = pwalletMain->IncOrderPosNext();
walletdb.WriteAccountingEntry(ae); walletdb.WriteAccountingEntry(ae);
GetResults(walletdb, results); GetResults(walletdb, results);

View File

@ -291,6 +291,13 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
return true; return true;
} }
int64 CWallet::IncOrderPosNext()
{
int64 nRet = nOrderPosNext;
CWalletDB(strWalletFile).WriteOrderPosNext(++nOrderPosNext);
return nRet;
}
CWallet::TxItems CWallet::OrderedTxItems(std::list<CAccountingEntry>& acentries, std::string strAccount) CWallet::TxItems CWallet::OrderedTxItems(std::list<CAccountingEntry>& acentries, std::string strAccount)
{ {
CWalletDB walletdb(strWalletFile); CWalletDB walletdb(strWalletFile);
@ -362,7 +369,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
if (fInsertedNew) if (fInsertedNew)
{ {
wtx.nTimeReceived = GetAdjustedTime(); wtx.nTimeReceived = GetAdjustedTime();
wtx.nOrderPos = nOrderPosNext++; wtx.nOrderPos = IncOrderPosNext();
wtx.nTimeSmart = wtx.nTimeReceived; wtx.nTimeSmart = wtx.nTimeReceived;
if (wtxIn.hashBlock != 0) if (wtxIn.hashBlock != 0)

View File

@ -98,6 +98,7 @@ public:
fFileBacked = false; fFileBacked = false;
nMasterKeyMaxID = 0; nMasterKeyMaxID = 0;
pwalletdbEncryption = NULL; pwalletdbEncryption = NULL;
nOrderPosNext = 0;
} }
CWallet(std::string strWalletFileIn) CWallet(std::string strWalletFileIn)
{ {
@ -107,6 +108,7 @@ public:
fFileBacked = true; fFileBacked = true;
nMasterKeyMaxID = 0; nMasterKeyMaxID = 0;
pwalletdbEncryption = NULL; pwalletdbEncryption = NULL;
nOrderPosNext = 0;
} }
std::map<uint256, CWalletTx> mapWallet; std::map<uint256, CWalletTx> mapWallet;
@ -144,6 +146,11 @@ public:
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase); bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
bool EncryptWallet(const SecureString& strWalletPassphrase); bool EncryptWallet(const SecureString& strWalletPassphrase);
/** Increment the next transaction order id
@return next transaction order id
*/
int64 IncOrderPosNext();
typedef std::pair<CWalletTx*, CAccountingEntry*> TxPair; typedef std::pair<CWalletTx*, CAccountingEntry*> TxPair;
typedef std::multimap<int64, TxPair > TxItems; typedef std::multimap<int64, TxPair > TxItems;

View File

@ -392,6 +392,10 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
return DB_CORRUPT; return DB_CORRUPT;
} }
} }
else if (strType == "orderposnext")
{
ssValue >> pwallet->nOrderPosNext;
}
} }
pcursor->close(); pcursor->close();
} }

View File

@ -115,6 +115,12 @@ public:
return Read(std::string("bestblock"), locator); return Read(std::string("bestblock"), locator);
} }
bool WriteOrderPosNext(int64 nOrderPosNext)
{
nWalletDBUpdated++;
return Write(std::string("orderposnext"), nOrderPosNext);
}
bool ReadDefaultKey(std::vector<unsigned char>& vchPubKey) bool ReadDefaultKey(std::vector<unsigned char>& vchPubKey)
{ {
vchPubKey.clear(); vchPubKey.clear();