aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Dashjr <luke-jr+git@utopios.org>2012-09-08 04:55:36 +0000
committerLuke Dashjr <luke-jr+git@utopios.org>2012-09-08 04:55:36 +0000
commitda7b8c1260d91e3306eb18dd65633567cb31332f (patch)
tree1fad88d0c8f5bb0953887c268e9a5a55910931d8
parentddb709e9de1490afcfa1af045517d2228d5b864c (diff)
Bugfix: Initialize CWallet::nOrderPosNext on an empty wallet, and save it in db
-rw-r--r--src/rpcwallet.cpp4
-rw-r--r--src/test/accounting_tests.cpp2
-rw-r--r--src/wallet.cpp9
-rw-r--r--src/wallet.h7
-rw-r--r--src/walletdb.cpp4
-rw-r--r--src/walletdb.h6
6 files changed, 28 insertions, 4 deletions
diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp
index 20df4c0a68..475fe1baf9 100644
--- a/src/rpcwallet.cpp
+++ b/src/rpcwallet.cpp
@@ -544,7 +544,7 @@ Value movecmd(const Array& params, bool fHelp)
// Debit
CAccountingEntry debit;
- debit.nOrderPos = pwalletMain->nOrderPosNext++;
+ debit.nOrderPos = pwalletMain->IncOrderPosNext();
debit.strAccount = strFrom;
debit.nCreditDebit = -nAmount;
debit.nTime = nNow;
@@ -554,7 +554,7 @@ Value movecmd(const Array& params, bool fHelp)
// Credit
CAccountingEntry credit;
- credit.nOrderPos = pwalletMain->nOrderPosNext++;
+ credit.nOrderPos = pwalletMain->IncOrderPosNext();
credit.strAccount = strTo;
credit.nCreditDebit = nAmount;
credit.nTime = nNow;
diff --git a/src/test/accounting_tests.cpp b/src/test/accounting_tests.cpp
index c474fd65c1..8ac657288b 100644
--- a/src/test/accounting_tests.cpp
+++ b/src/test/accounting_tests.cpp
@@ -60,7 +60,7 @@ BOOST_AUTO_TEST_CASE(acc_orderupgrade)
ae.nTime = 1333333330;
ae.strOtherAccount = "d";
- ae.nOrderPos = pwalletMain->nOrderPosNext++;
+ ae.nOrderPos = pwalletMain->IncOrderPosNext();
walletdb.WriteAccountingEntry(ae);
GetResults(walletdb, results);
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 3af9fdaeae..74c1112d60 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -291,6 +291,13 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
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)
{
CWalletDB walletdb(strWalletFile);
@@ -362,7 +369,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
if (fInsertedNew)
{
wtx.nTimeReceived = GetAdjustedTime();
- wtx.nOrderPos = nOrderPosNext++;
+ wtx.nOrderPos = IncOrderPosNext();
wtx.nTimeSmart = wtx.nTimeReceived;
if (wtxIn.hashBlock != 0)
diff --git a/src/wallet.h b/src/wallet.h
index 65d3448212..d3e9fd4ba4 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -98,6 +98,7 @@ public:
fFileBacked = false;
nMasterKeyMaxID = 0;
pwalletdbEncryption = NULL;
+ nOrderPosNext = 0;
}
CWallet(std::string strWalletFileIn)
{
@@ -107,6 +108,7 @@ public:
fFileBacked = true;
nMasterKeyMaxID = 0;
pwalletdbEncryption = NULL;
+ nOrderPosNext = 0;
}
std::map<uint256, CWalletTx> mapWallet;
@@ -144,6 +146,11 @@ public:
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
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::multimap<int64, TxPair > TxItems;
diff --git a/src/walletdb.cpp b/src/walletdb.cpp
index 164b68e11f..0fac0109c8 100644
--- a/src/walletdb.cpp
+++ b/src/walletdb.cpp
@@ -392,6 +392,10 @@ int CWalletDB::LoadWallet(CWallet* pwallet)
return DB_CORRUPT;
}
}
+ else if (strType == "orderposnext")
+ {
+ ssValue >> pwallet->nOrderPosNext;
+ }
}
pcursor->close();
}
diff --git a/src/walletdb.h b/src/walletdb.h
index 187be65a97..d339d4c3f1 100644
--- a/src/walletdb.h
+++ b/src/walletdb.h
@@ -115,6 +115,12 @@ public:
return Read(std::string("bestblock"), locator);
}
+ bool WriteOrderPosNext(int64 nOrderPosNext)
+ {
+ nWalletDBUpdated++;
+ return Write(std::string("orderposnext"), nOrderPosNext);
+ }
+
bool ReadDefaultKey(std::vector<unsigned char>& vchPubKey)
{
vchPubKey.clear();