mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 21:12:48 +01:00
Move CWalletDB::ReorderTransactions to CWallet
This commit is contained in:
parent
d2143dc937
commit
86029e72c9
@ -658,8 +658,79 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
|
|||||||
|
|
||||||
DBErrors CWallet::ReorderTransactions()
|
DBErrors CWallet::ReorderTransactions()
|
||||||
{
|
{
|
||||||
|
LOCK(cs_wallet);
|
||||||
CWalletDB walletdb(strWalletFile);
|
CWalletDB walletdb(strWalletFile);
|
||||||
return walletdb.ReorderTransactions(this);
|
|
||||||
|
// Old wallets didn't have any defined order for transactions
|
||||||
|
// Probably a bad idea to change the output of this
|
||||||
|
|
||||||
|
// First: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap.
|
||||||
|
typedef pair<CWalletTx*, CAccountingEntry*> TxPair;
|
||||||
|
typedef multimap<int64_t, TxPair > TxItems;
|
||||||
|
TxItems txByTime;
|
||||||
|
|
||||||
|
for (map<uint256, CWalletTx>::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
||||||
|
{
|
||||||
|
CWalletTx* wtx = &((*it).second);
|
||||||
|
txByTime.insert(make_pair(wtx->nTimeReceived, TxPair(wtx, (CAccountingEntry*)0)));
|
||||||
|
}
|
||||||
|
list<CAccountingEntry> acentries;
|
||||||
|
walletdb.ListAccountCreditDebit("", acentries);
|
||||||
|
BOOST_FOREACH(CAccountingEntry& entry, acentries)
|
||||||
|
{
|
||||||
|
txByTime.insert(make_pair(entry.nTime, TxPair((CWalletTx*)0, &entry)));
|
||||||
|
}
|
||||||
|
|
||||||
|
nOrderPosNext = 0;
|
||||||
|
std::vector<int64_t> nOrderPosOffsets;
|
||||||
|
for (TxItems::iterator it = txByTime.begin(); it != txByTime.end(); ++it)
|
||||||
|
{
|
||||||
|
CWalletTx *const pwtx = (*it).second.first;
|
||||||
|
CAccountingEntry *const pacentry = (*it).second.second;
|
||||||
|
int64_t& nOrderPos = (pwtx != 0) ? pwtx->nOrderPos : pacentry->nOrderPos;
|
||||||
|
|
||||||
|
if (nOrderPos == -1)
|
||||||
|
{
|
||||||
|
nOrderPos = nOrderPosNext++;
|
||||||
|
nOrderPosOffsets.push_back(nOrderPos);
|
||||||
|
|
||||||
|
if (pwtx)
|
||||||
|
{
|
||||||
|
if (!walletdb.WriteTx(*pwtx))
|
||||||
|
return DB_LOAD_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (!walletdb.WriteAccountingEntry(pacentry->nEntryNo, *pacentry))
|
||||||
|
return DB_LOAD_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int64_t nOrderPosOff = 0;
|
||||||
|
BOOST_FOREACH(const int64_t& nOffsetStart, nOrderPosOffsets)
|
||||||
|
{
|
||||||
|
if (nOrderPos >= nOffsetStart)
|
||||||
|
++nOrderPosOff;
|
||||||
|
}
|
||||||
|
nOrderPos += nOrderPosOff;
|
||||||
|
nOrderPosNext = std::max(nOrderPosNext, nOrderPos + 1);
|
||||||
|
|
||||||
|
if (!nOrderPosOff)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Since we're changing the order, write it back
|
||||||
|
if (pwtx)
|
||||||
|
{
|
||||||
|
if (!walletdb.WriteTx(*pwtx))
|
||||||
|
return DB_LOAD_FAIL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (!walletdb.WriteAccountingEntry(pacentry->nEntryNo, *pacentry))
|
||||||
|
return DB_LOAD_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
walletdb.WriteOrderPosNext(nOrderPosNext);
|
||||||
|
|
||||||
|
return DB_LOAD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t CWallet::IncOrderPosNext(CWalletDB *pwalletdb)
|
int64_t CWallet::IncOrderPosNext(CWalletDB *pwalletdb)
|
||||||
|
@ -251,82 +251,6 @@ void CWalletDB::ListAccountCreditDebit(const string& strAccount, list<CAccountin
|
|||||||
pcursor->close();
|
pcursor->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
DBErrors CWalletDB::ReorderTransactions(CWallet* pwallet)
|
|
||||||
{
|
|
||||||
LOCK(pwallet->cs_wallet);
|
|
||||||
// Old wallets didn't have any defined order for transactions
|
|
||||||
// Probably a bad idea to change the output of this
|
|
||||||
|
|
||||||
// First: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap.
|
|
||||||
typedef pair<CWalletTx*, CAccountingEntry*> TxPair;
|
|
||||||
typedef multimap<int64_t, TxPair > TxItems;
|
|
||||||
TxItems txByTime;
|
|
||||||
|
|
||||||
for (map<uint256, CWalletTx>::iterator it = pwallet->mapWallet.begin(); it != pwallet->mapWallet.end(); ++it)
|
|
||||||
{
|
|
||||||
CWalletTx* wtx = &((*it).second);
|
|
||||||
txByTime.insert(make_pair(wtx->nTimeReceived, TxPair(wtx, (CAccountingEntry*)0)));
|
|
||||||
}
|
|
||||||
list<CAccountingEntry> acentries;
|
|
||||||
ListAccountCreditDebit("", acentries);
|
|
||||||
BOOST_FOREACH(CAccountingEntry& entry, acentries)
|
|
||||||
{
|
|
||||||
txByTime.insert(make_pair(entry.nTime, TxPair((CWalletTx*)0, &entry)));
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t& nOrderPosNext = pwallet->nOrderPosNext;
|
|
||||||
nOrderPosNext = 0;
|
|
||||||
std::vector<int64_t> nOrderPosOffsets;
|
|
||||||
for (TxItems::iterator it = txByTime.begin(); it != txByTime.end(); ++it)
|
|
||||||
{
|
|
||||||
CWalletTx *const pwtx = (*it).second.first;
|
|
||||||
CAccountingEntry *const pacentry = (*it).second.second;
|
|
||||||
int64_t& nOrderPos = (pwtx != 0) ? pwtx->nOrderPos : pacentry->nOrderPos;
|
|
||||||
|
|
||||||
if (nOrderPos == -1)
|
|
||||||
{
|
|
||||||
nOrderPos = nOrderPosNext++;
|
|
||||||
nOrderPosOffsets.push_back(nOrderPos);
|
|
||||||
|
|
||||||
if (pwtx)
|
|
||||||
{
|
|
||||||
if (!WriteTx(*pwtx))
|
|
||||||
return DB_LOAD_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if (!WriteAccountingEntry(pacentry->nEntryNo, *pacentry))
|
|
||||||
return DB_LOAD_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int64_t nOrderPosOff = 0;
|
|
||||||
BOOST_FOREACH(const int64_t& nOffsetStart, nOrderPosOffsets)
|
|
||||||
{
|
|
||||||
if (nOrderPos >= nOffsetStart)
|
|
||||||
++nOrderPosOff;
|
|
||||||
}
|
|
||||||
nOrderPos += nOrderPosOff;
|
|
||||||
nOrderPosNext = std::max(nOrderPosNext, nOrderPos + 1);
|
|
||||||
|
|
||||||
if (!nOrderPosOff)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Since we're changing the order, write it back
|
|
||||||
if (pwtx)
|
|
||||||
{
|
|
||||||
if (!WriteTx(*pwtx))
|
|
||||||
return DB_LOAD_FAIL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if (!WriteAccountingEntry(pacentry->nEntryNo, *pacentry))
|
|
||||||
return DB_LOAD_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WriteOrderPosNext(nOrderPosNext);
|
|
||||||
|
|
||||||
return DB_LOAD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
class CWalletScanState {
|
class CWalletScanState {
|
||||||
public:
|
public:
|
||||||
unsigned int nKeys;
|
unsigned int nKeys;
|
||||||
@ -711,7 +635,7 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
|
|||||||
WriteVersion(CLIENT_VERSION);
|
WriteVersion(CLIENT_VERSION);
|
||||||
|
|
||||||
if (wss.fAnyUnordered)
|
if (wss.fAnyUnordered)
|
||||||
result = ReorderTransactions(pwallet);
|
result = pwallet->ReorderTransactions();
|
||||||
|
|
||||||
pwallet->laccentries.clear();
|
pwallet->laccentries.clear();
|
||||||
ListAccountCreditDebit("*", pwallet->laccentries);
|
ListAccountCreditDebit("*", pwallet->laccentries);
|
||||||
|
@ -153,6 +153,7 @@ public:
|
|||||||
|
|
||||||
/// This writes directly to the database, and will not update the CWallet's cached accounting entries!
|
/// This writes directly to the database, and will not update the CWallet's cached accounting entries!
|
||||||
/// Use wallet.AddAccountingEntry instead, to write *and* update its caches.
|
/// Use wallet.AddAccountingEntry instead, to write *and* update its caches.
|
||||||
|
bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
|
||||||
bool WriteAccountingEntry_Backend(const CAccountingEntry& acentry);
|
bool WriteAccountingEntry_Backend(const CAccountingEntry& acentry);
|
||||||
bool ReadAccount(const std::string& strAccount, CAccount& account);
|
bool ReadAccount(const std::string& strAccount, CAccount& account);
|
||||||
bool WriteAccount(const std::string& strAccount, const CAccount& account);
|
bool WriteAccount(const std::string& strAccount, const CAccount& account);
|
||||||
@ -165,7 +166,6 @@ public:
|
|||||||
CAmount GetAccountCreditDebit(const std::string& strAccount);
|
CAmount GetAccountCreditDebit(const std::string& strAccount);
|
||||||
void ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& acentries);
|
void ListAccountCreditDebit(const std::string& strAccount, std::list<CAccountingEntry>& acentries);
|
||||||
|
|
||||||
DBErrors ReorderTransactions(CWallet* pwallet);
|
|
||||||
DBErrors LoadWallet(CWallet* pwallet);
|
DBErrors LoadWallet(CWallet* pwallet);
|
||||||
DBErrors FindWalletTx(CWallet* pwallet, std::vector<uint256>& vTxHash, std::vector<CWalletTx>& vWtx);
|
DBErrors FindWalletTx(CWallet* pwallet, std::vector<uint256>& vTxHash, std::vector<CWalletTx>& vWtx);
|
||||||
DBErrors ZapWalletTx(CWallet* pwallet, std::vector<CWalletTx>& vWtx);
|
DBErrors ZapWalletTx(CWallet* pwallet, std::vector<CWalletTx>& vWtx);
|
||||||
@ -180,7 +180,6 @@ private:
|
|||||||
CWalletDB(const CWalletDB&);
|
CWalletDB(const CWalletDB&);
|
||||||
void operator=(const CWalletDB&);
|
void operator=(const CWalletDB&);
|
||||||
|
|
||||||
bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void ThreadFlushWalletDB(const std::string& strFile);
|
void ThreadFlushWalletDB(const std::string& strFile);
|
||||||
|
Loading…
Reference in New Issue
Block a user